Merge branch 'master' into MemoryBudget
diff --git a/docs/html/allocation_annotation.html b/docs/html/allocation_annotation.html
index 1b88ffa..6951c23 100644
--- a/docs/html/allocation_annotation.html
+++ b/docs/html/allocation_annotation.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Allocation names and user data</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -72,21 +68,66 @@
 <div class="textblock"><h1><a class="anchor" id="allocation_user_data"></a>
 Allocation user data</h1>
 <p>You can annotate allocations with your own information, e.g. for debugging purposes. To do that, fill <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> field when creating an allocation. It's an opaque <code>void*</code> pointer. You can use it e.g. as a pointer, some handle, index, key, ordinal number or any other value that would associate the allocation with your custom metadata.</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line"><span class="comment">// Fill bufferInfo...</span></div><div class="line"></div><div class="line">MyBufferMetadata* pMetadata = CreateBufferMetadata();</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = pMetadata;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocCreateInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div><div class="line">MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div></div><!-- fragment --><p>It can also be changed using function <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.</p>
-<p>Values of (non-zero) allocations' <code>pUserData</code> are printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>, in hexadecimal form.</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line"><span class="comment">// Fill bufferInfo...</span></div>
+<div class="line"> </div>
+<div class="line">MyBufferMetadata* pMetadata = CreateBufferMetadata();</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = pMetadata;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocCreateInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div>
+<div class="line">MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div>
+</div><!-- fragment --><p>It can also be changed using function <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.</p>
+<p>Values of (non-zero) allocations' <code>pUserData</code> are printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>, in hexadecimal form.</p>
 <h1><a class="anchor" id="allocation_names"></a>
 Allocation names</h1>
-<p>There is alternative mode available where <code>pUserData</code> pointer is used to point to a null-terminated string, giving a name to the allocation. To use this mode, set <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>. Then <code>pUserData</code> passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or argument to <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a> must be either null or pointer to a null-terminated string. The library creates internal copy of the string, so the pointer you pass doesn't need to be valid for whole lifetime of the allocation. You can free it after the call.</p>
-<div class="fragment"><div class="line">VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div><div class="line"><span class="comment">// Fill imageInfo...</span></div><div class="line"></div><div class="line">std::string imageName = <span class="stringliteral">&quot;Texture: &quot;</span>;</div><div class="line">imageName += fileName;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = imageName.c_str();</div><div class="line"></div><div class="line">VkImage image;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(allocator, &amp;imageInfo, &amp;allocCreateInfo, &amp;image, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line">printf(<span class="stringliteral">&quot;Image name: %s\n&quot;</span>, imageName);</div></div><!-- fragment --><p>That string is also printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+<p>There is alternative mode available where <code>pUserData</code> pointer is used to point to a null-terminated string, giving a name to the allocation. To use this mode, set <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>. Then <code>pUserData</code> passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or argument to <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a> must be either null or pointer to a null-terminated string. The library creates internal copy of the string, so the pointer you pass doesn't need to be valid for whole lifetime of the allocation. You can free it after the call.</p>
+<div class="fragment"><div class="line">VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div>
+<div class="line"><span class="comment">// Fill imageInfo...</span></div>
+<div class="line"> </div>
+<div class="line">std::string imageName = <span class="stringliteral">&quot;Texture: &quot;</span>;</div>
+<div class="line">imageName += fileName;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = imageName.c_str();</div>
+<div class="line"> </div>
+<div class="line">VkImage image;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a>(allocator, &amp;imageInfo, &amp;allocCreateInfo, &amp;image, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div>
+<div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div>
+<div class="line">printf(<span class="stringliteral">&quot;Image name: %s\n&quot;</span>, imageName);</div>
+</div><!-- fragment --><p>That string is also printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="avk__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:2339</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a001bd7a2077a42caf256a6fb2f2ba131"><div class="ttname"><a href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2433</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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="avk__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:2251</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="astruct_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:2748</div></div>
+<div class="ttc" id="astruct_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:2396</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
+<div class="ttc" id="astruct_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:2710</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae10b53588f197141c6e88a1f5ec34789"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
index ece3148..1a81e3a 100644
--- a/docs/html/annotated.html
+++ b/docs/html/annotated.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -69,21 +69,22 @@
 <table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation.html" target="_self">VmaAllocation</a></td><td class="desc">Represents single memory allocation </td></tr>
 <tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_create_info.html" target="_self">VmaAllocationCreateInfo</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_info.html" target="_self">VmaAllocationInfo</a></td><td class="desc">Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> </td></tr>
+<tr id="row_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#ae10b53588f197141c6e88a1f5ec34789" 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_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>
+<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_budget.html" target="_self">VmaBudget</a></td><td class="desc">Statistics of current memory usage and available budget, in bytes, for specific memory heap </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_context.html" target="_self">VmaDefragmentationContext</a></td><td class="desc">Represents Opaque object that represents started defragmentation process </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_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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a> </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_info2.html" target="_self">VmaDefragmentationInfo2</a></td><td class="desc">Parameters for defragmentation </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_defragmentation_stats.html" target="_self">VmaDefragmentationStats</a></td><td class="desc">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</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_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_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.html" target="_self">VmaPool</a></td><td class="desc">Represents custom memory pool </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_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_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_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_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_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_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_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire 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_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
+<tr id="row_17_"><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 -->
@@ -91,7 +92,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/choosing_memory_type.html b/docs/html/choosing_memory_type.html
index 623d20e..181538b 100644
--- a/docs/html/choosing_memory_type.html
+++ b/docs/html/choosing_memory_type.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Choosing memory type</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -71,10 +67,10 @@
 <div class="contents">
 <div class="textblock"><p>Physical devices in Vulkan support various combinations of memory heaps and types. Help with choosing correct and optimal memory type for your specific resource is one of the key features of this library. You can use it by filling appropriate members of <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure, as described below. You can also combine multiple methods.</p>
 <ol type="1">
-<li>If you just want to find memory type index that meets your requirements, you can use function: <a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a" title="Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndex()</a>, <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>.</li>
-<li>If you want to allocate a region of device memory without association with any specific image or buffer, you can use function <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a>. Usage of this function is not recommended and usually not needed. <a class="el" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1" title="General purpose memory allocation for multiple allocation objects at once.">vmaAllocateMemoryPages()</a> function is also provided for creating multiple allocations at once, which may be useful for sparse binding.</li>
-<li>If you already have a buffer or an image created, you want to allocate memory for it and then you will bind it yourself, you can use function <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>. For binding you should use functions: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5" title="Binds image to allocation.">vmaBindImageMemory()</a> or their extended versions: <a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a" title="Binds buffer to allocation with additional parameters.">vmaBindBufferMemory2()</a>, <a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc" title="Binds image to allocation with additional parameters.">vmaBindImageMemory2()</a>.</li>
-<li>If you want to create a buffer or an image, allocate memory for it and bind them together, all in one call, you can use function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>. This is the easiest and recommended way to use this library.</li>
+<li>If you just want to find memory type index that meets your requirements, you can use function: <a class="el" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c" title="Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndex()</a>, <a class="el" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>.</li>
+<li>If you want to allocate a region of device memory without association with any specific image or buffer, you can use function <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a>. Usage of this function is not recommended and usually not needed. <a class="el" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325" title="General purpose memory allocation for multiple allocation objects at once.">vmaAllocateMemoryPages()</a> function is also provided for creating multiple allocations at once, which may be useful for sparse binding.</li>
+<li>If you already have a buffer or an image created, you want to allocate memory for it and then you will bind it yourself, you can use function <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>. For binding you should use functions: <a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272" title="Binds image to allocation.">vmaBindImageMemory()</a> or their extended versions: <a class="el" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf" title="Binds buffer to allocation with additional parameters.">vmaBindBufferMemory2()</a>, <a class="el" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb" title="Binds image to allocation with additional parameters.">vmaBindImageMemory2()</a>.</li>
+<li>If you want to create a buffer or an image, allocate memory for it and bind them together, all in one call, you can use function <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>. This is the easiest and recommended way to use this library.</li>
 </ol>
 <p>When using 3. or 4., the library internally queries Vulkan for memory types supported for that buffer or image (function <code>vkGetBufferMemoryRequirements()</code>) and uses only one of these types.</p>
 <p>If no memory type can be found that meets all the requirements, these functions return <code>VK_ERROR_FEATURE_NOT_PRESENT</code>.</p>
@@ -83,16 +79,42 @@
 Usage</h1>
 <p>The easiest way to specify memory requirements is to fill member <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory.">VmaAllocationCreateInfo::usage</a> using one of the values of enum <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>. It defines high level, common usage types. For more details, see description of this enum.</p>
 <p>For example, if you want to create a uniform buffer that will be filled using transfer only once or infrequently and used for rendering every frame, you can do it using following code:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufferInfo.size = 65536;</div>
+<div class="line">bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a>
 Required and preferred flags</h1>
 <p>You can specify more detailed requirements by filling members <a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90" title="Flags that must be set in a Memory Type chosen for an allocation.">VmaAllocationCreateInfo::requiredFlags</a> and <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d" title="Flags that preferably should be set in a memory type chosen for an allocation.">VmaAllocationCreateInfo::preferredFlags</a> with a combination of bits from enum <code>VkMemoryPropertyFlags</code>. For example, if you want to create a buffer that will be persistently mapped on host (so it must be <code>HOST_VISIBLE</code>) and preferably will also be <code>HOST_COHERENT</code> and <code>HOST_CACHED</code>, use following code:</p>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p>
 <p>If you use <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory.">VmaAllocationCreateInfo::usage</a>, it is just internally converted to a set of required and preferred flags.</p>
 <h1><a class="anchor" id="choosing_memory_type_explicit_memory_types"></a>
 Explicit memory types</h1>
 <p>If you inspected memory types available on the physical device and you have a preference for memory types that you want to use, you can fill member <a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055" title="Bitmask containing one bit set for every memory type acceptable for this allocation.">VmaAllocationCreateInfo::memoryTypeBits</a>. It is a bit mask, where each bit set means that a memory type with that index is allowed to be used for the allocation. Special value 0, just like <code>UINT32_MAX</code>, means there are no restrictions to memory type index.</p>
 <p>Please note that this member is NOT just a memory type index. Still you can use it to choose just one, specific memory type. For example, if you already determined that your buffer should be created in memory type 2, use following code:</p>
-<div class="fragment"><div class="line">uint32_t memoryTypeIndex = 2;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> = 1u &lt;&lt; memoryTypeIndex;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a>
+<div class="fragment"><div class="line">uint32_t memoryTypeIndex = 2;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> = 1u &lt;&lt; memoryTypeIndex;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a>
 Custom memory pools</h1>
 <p>If you allocate from custom memory pool, all the ways of specifying memory requirements described above are not applicable and the aforementioned members of <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure are ignored. Memory type is selected explicitly when creating the pool and then used to make all the allocations from that pool. For further details, see <a class="el" href="custom_memory_pools.html">Custom memory pools</a>.</p>
 <h1><a class="anchor" id="choosing_memory_type_dedicated_allocations"></a>
@@ -103,13 +125,23 @@
 <li>When <a class="el" href="vk_khr_dedicated_allocation.html">VK_KHR_dedicated_allocation</a> extension is enabled and it reports that dedicated allocation is required or recommended for the resource.</li>
 <li>When allocation of next big memory block fails due to not enough device memory, but allocation with the exact requested size succeeds. </li>
 </ul>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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="avk__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:2251</div></div>
+<div class="ttc" id="astruct_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:2407</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="avk__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:2313</div></div>
+<div class="ttc" id="astruct_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:2396</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
+<div class="ttc" id="astruct_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:2412</div></div>
+<div class="ttc" id="astruct_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:2420</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/classes.html b/docs/html/classes.html
index d7b29f2..6f4ae01 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Index</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -68,10 +68,29 @@
 <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_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></td><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>
+</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_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>
+</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_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_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_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_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td>
+<td valign="top"><a class="el" href="struct_vma_budget.html">VmaBudget</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></td><td></td><td></td><td></td><td></td></tr>
 </table>
 <div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
@@ -80,7 +99,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/configuration.html b/docs/html/configuration.html
index e051d07..49359ef 100644
--- a/docs/html/configuration.html
+++ b/docs/html/configuration.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Configuration</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -89,13 +85,13 @@
 <p>When device memory of certain heap runs out of free space, new allocations may fail (returning error code) or they may succeed, silently pushing some existing memory blocks from GPU VRAM to system RAM (which degrades performance). This behavior is implementation-dependant - it depends on GPU vendor and graphics driver.</p>
 <p>On AMD cards it can be controlled while creating Vulkan device object by using VK_AMD_memory_overallocation_behavior extension, if available.</p>
 <p>Alternatively, if you want to test how your program behaves with limited amount of Vulkan device memory available without switching your graphics card to one that really has smaller VRAM, you can use a feature of this library intended for this purpose. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b" title="Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...">VmaAllocatorCreateInfo::pHeapSizeLimit</a>. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/custom_memory_pools.html b/docs/html/custom_memory_pools.html
index 0ce1951..73a042f 100644
--- a/docs/html/custom_memory_pools.html
+++ b/docs/html/custom_memory_pools.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Custom memory pools</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -80,15 +76,51 @@
 <p>To use custom memory pools:</p>
 <ol type="1">
 <li>Fill <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool.">VmaPoolCreateInfo</a> structure.</li>
-<li>Call <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to obtain <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> handle.</li>
+<li>Call <a class="el" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to obtain <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> handle.</li>
 <li>When making an allocation, set <a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> to this handle. You don't need to specify any other parameters of this structure, like <code>usage</code>.</li>
 </ol>
 <p>Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Create a pool that can have at most 2 blocks, 128 MiB each.</span></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = ...</div><div class="line">poolCreateInfo.blockSize = 128ull * 1024 * 1024;</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = 2;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_pool.html">VmaPool</a> pool;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(allocator, &amp;poolCreateInfo, &amp;pool);</div><div class="line"></div><div class="line"><span class="comment">// Allocate a buffer out of it.</span></div><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = 1024;</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> = pool;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div></div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p>
-<div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buf, alloc);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(allocator, pool);</div></div><!-- fragment --><h1><a class="anchor" id="custom_memory_pools_MemTypeIndex"></a>
+<div class="fragment"><div class="line"><span class="comment">// Create a pool that can have at most 2 blocks, 128 MiB each.</span></div>
+<div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div>
+<div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = ...</div>
+<div class="line">poolCreateInfo.blockSize = 128ull * 1024 * 1024;</div>
+<div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = 2;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_pool.html">VmaPool</a> pool;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a>(allocator, &amp;poolCreateInfo, &amp;pool);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// Allocate a buffer out of it.</span></div>
+<div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufCreateInfo.size = 1024;</div>
+<div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> = pool;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buf;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
+</div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p>
+<div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a>(allocator, buf, alloc);</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a>(allocator, pool);</div>
+</div><!-- fragment --><h1><a class="anchor" id="custom_memory_pools_MemTypeIndex"></a>
 Choosing memory type index</h1>
-<p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use helper functions <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>. You need to provide structures with example parameters of buffers or images that you are going to create in that pool.</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">exampleBufCreateInfo.size = 1024; <span class="comment">// Whatever.</span></div><div class="line">exampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line">uint32_t memTypeIndex;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(allocator, &amp;exampleBufCreateInfo, &amp;allocCreateInfo, &amp;memTypeIndex);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div><div class="line"><span class="comment">// ...</span></div></div><!-- fragment --><p>When creating buffers/images allocated in that pool, provide following parameters:</p>
+<p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use helper functions <a class="el" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>. You need to provide structures with example parameters of buffers or images that you are going to create in that pool.</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">exampleBufCreateInfo.size = 1024; <span class="comment">// Whatever.</span></div>
+<div class="line">exampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; <span class="comment">// Change if needed.</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>; <span class="comment">// Change if needed.</span></div>
+<div class="line"> </div>
+<div class="line">uint32_t memTypeIndex;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a>(allocator, &amp;exampleBufCreateInfo, &amp;allocCreateInfo, &amp;memTypeIndex);</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div>
+<div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div>
+<div class="line"><span class="comment">// ...</span></div>
+</div><!-- fragment --><p>When creating buffers/images allocated in that pool, provide following parameters:</p>
 <ul>
 <li><code>VkBufferCreateInfo</code>: Prefer to pass same parameters as above. Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior. Using different <code>VK_BUFFER_USAGE_</code> flags may work, but you shouldn't create images in a pool intended for buffers or the other way around.</li>
 <li><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>: You don't need to pass same parameters. Fill only <code>pool</code> member. Other members are ignored anyway.</li>
@@ -96,19 +128,19 @@
 <h1><a class="anchor" id="linear_algorithm"></a>
 Linear allocation algorithm</h1>
 <p>Each Vulkan memory block managed by this library has accompanying metadata that keeps track of used and unused regions. By default, the metadata structure and algorithm tries to find best place for new allocations among free regions to optimize memory usage. This way you can allocate and free objects in any order.</p>
-<img src="../gfx/Linear_allocator_1_algo_default.png" alt="Default allocation algorithm" class="inline"/>
+<p><img src="../gfx/Linear_allocator_1_algo_default.png" alt="Default allocation algorithm" class="inline"/></p>
 <p>Sometimes there is a need to use simpler, linear allocation algorithm. You can create custom pool that uses such algorithm by adding flag <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726" title="Enables alternative, linear allocation algorithm in this pool.">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> to <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446" title="Use combination of VmaPoolCreateFlagBits.">VmaPoolCreateInfo::flags</a> while creating <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object. Then an alternative metadata management is used. It always creates new allocations after last one and doesn't reuse free regions after allocations freed in the middle. It results in better allocation performance and less memory consumed by metadata.</p>
-<img src="../gfx/Linear_allocator_2_algo_linear.png" alt="Linear allocation algorithm" class="inline"/>
+<p><img src="../gfx/Linear_allocator_2_algo_linear.png" alt="Linear allocation algorithm" class="inline"/></p>
 <p>With this one flag, you can create a custom pool that can be used in many ways: free-at-once, stack, double stack, and ring buffer. See below for details.</p>
 <h2><a class="anchor" id="linear_algorithm_free_at_once"></a>
 Free-at-once</h2>
-<p>In a pool that uses linear algorithm, you still need to free all the allocations individually, e.g. by using <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a>. You can free them in any order. New allocations are always made after last one - free space in the middle is not reused. However, when you release all the allocation and the pool becomes empty, allocation starts from the beginning again. This way you can use linear algorithm to speed up creation of allocations that you are going to release all at once.</p>
-<img src="../gfx/Linear_allocator_3_free_at_once.png" alt="Free-at-once" class="inline"/>
+<p>In a pool that uses linear algorithm, you still need to free all the allocations individually, e.g. by using <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a>. You can free them in any order. New allocations are always made after last one - free space in the middle is not reused. However, when you release all the allocation and the pool becomes empty, allocation starts from the beginning again. This way you can use linear algorithm to speed up creation of allocations that you are going to release all at once.</p>
+<p><img src="../gfx/Linear_allocator_3_free_at_once.png" alt="Free-at-once" class="inline"/></p>
 <p>This mode is also available for pools created with <a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c" title="Maximum number of blocks that can be allocated in this pool. Optional.">VmaPoolCreateInfo::maxBlockCount</a> value that allows multiple memory blocks.</p>
 <h2><a class="anchor" id="linear_algorithm_stack"></a>
 Stack</h2>
 <p>When you free an allocation that was created last, its space can be reused. Thanks to this, if you always release allocations in the order opposite to their creation (LIFO - Last In First Out), you can achieve behavior of a stack.</p>
-<img src="../gfx/Linear_allocator_4_stack.png" alt="Stack" class="inline"/>
+<p><img src="../gfx/Linear_allocator_4_stack.png" alt="Stack" class="inline"/></p>
 <p>This mode is also available for pools created with <a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c" title="Maximum number of blocks that can be allocated in this pool. Optional.">VmaPoolCreateInfo::maxBlockCount</a> value that allows multiple memory blocks.</p>
 <h2><a class="anchor" id="linear_algorithm_double_stack"></a>
 Double stack</h2>
@@ -118,20 +150,20 @@
 <li>Second, "upper" one, growing down from the end towards lower offsets.</li>
 </ul>
 <p>To make allocation from upper stack, add flag <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> to <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>.</p>
-<img src="../gfx/Linear_allocator_7_double_stack.png" alt="Double stack" class="inline"/>
+<p><img src="../gfx/Linear_allocator_7_double_stack.png" alt="Double stack" class="inline"/></p>
 <p>Double stack is available only in pools with one memory block - <a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c" title="Maximum number of blocks that can be allocated in this pool. Optional.">VmaPoolCreateInfo::maxBlockCount</a> must be 1. Otherwise behavior is undefined.</p>
 <p>When the two stacks' ends meet so there is not enough space between them for a new allocation, such allocation fails with usual <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code> error.</p>
 <h2><a class="anchor" id="linear_algorithm_ring_buffer"></a>
 Ring buffer</h2>
 <p>When you free some allocations from the beginning and there is not enough free space for a new one at the end of a pool, allocator's "cursor" wraps around to the beginning and starts allocation there. Thanks to this, if you always release allocations in the same order as you created them (FIFO - First In First Out), you can achieve behavior of a ring buffer / queue.</p>
-<img src="../gfx/Linear_allocator_5_ring_buffer.png" alt="Ring buffer" class="inline"/>
+<p><img src="../gfx/Linear_allocator_5_ring_buffer.png" alt="Ring buffer" class="inline"/></p>
 <p>Pools with linear algorithm support <a class="el" href="lost_allocations.html">lost allocations</a> when used as ring buffer. If there is not enough free space for a new allocation, but existing allocations from the front of the queue can become lost, they become lost and the allocation succeeds.</p>
-<img src="../gfx/Linear_allocator_6_ring_buffer_lost.png" alt="Ring buffer with lost allocations" class="inline"/>
+<p><img src="../gfx/Linear_allocator_6_ring_buffer_lost.png" alt="Ring buffer with lost allocations" class="inline"/></p>
 <p>Ring buffer is available only in pools with one memory block - <a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c" title="Maximum number of blocks that can be allocated in this pool. Optional.">VmaPoolCreateInfo::maxBlockCount</a> must be 1. Otherwise behavior is undefined.</p>
 <h1><a class="anchor" id="buddy_algorithm"></a>
 Buddy allocation algorithm</h1>
 <p>There is another allocation algorithm that can be used with custom pools, called "buddy". Its internal data structure is based on a tree of blocks, each having size that is a power of two and a half of its parent's size. When you want to allocate memory of certain size, a free node in the tree is located. If it's too large, it is recursively split into two halves (called "buddies"). However, if requested allocation size is not a power of two, the size of a tree node is aligned up to the nearest power of two and the remaining space is wasted. When two buddy nodes become free, they are merged back into one larger node.</p>
-<img src="../gfx/Buddy_allocator.png" alt="Buddy allocator" class="inline"/>
+<p><img src="../gfx/Buddy_allocator.png" alt="Buddy allocator" class="inline"/></p>
 <p>The advantage of buddy allocation algorithm over default algorithm is faster allocation and deallocation, as well as smaller external fragmentation. The disadvantage is more wasted space (internal fragmentation).</p>
 <p>For more information, please read <a href="https://en.wikipedia.org/wiki/Buddy_memory_allocation">"Buddy memory allocation" on Wikipedia</a> or other sources that describe this concept in general.</p>
 <p>To use buddy allocation algorithm with a custom pool, add flag <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e" title="Enables alternative, buddy allocation algorithm in this pool.">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> to <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446" title="Use combination of VmaPoolCreateFlagBits.">VmaPoolCreateInfo::flags</a> while creating <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object.</p>
@@ -142,13 +174,28 @@
 <li><a class="el" href="lost_allocations.html">Lost allocations</a> don't work in such pools. You can use them, but they never become lost. Support may be added in the future.</li>
 <li><a class="el" href="defragmentation.html">Defragmentation</a> doesn't work with allocations made from such pool. </li>
 </ul>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="avk__mem__alloc_8h_html_a425905e868e4b487b5188f9d834dacbc"><div class="ttname"><a href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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:2558</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a11693ab08f65761a142c466c5eceb849"><div class="ttname"><a href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
+<div class="ttc" id="astruct_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:2426</div></div>
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_a3fa3daa743fcc950253f676aa8a323ea"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__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:2251</div></div>
+<div class="ttc" id="astruct_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:2583</div></div>
+<div class="ttc" id="astruct_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:2555</div></div>
+<div class="ttc" id="astruct_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="astruct_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:2402</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aee3406ab6b195cd85207ca2ef2d13a57"><div class="ttname"><a href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2393</div></div>
+<div class="ttc" id="astruct_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:2710</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/debugging_memory_usage.html b/docs/html/debugging_memory_usage.html
index bfe46d5..6e4cd7d 100644
--- a/docs/html/debugging_memory_usage.html
+++ b/docs/html/debugging_memory_usage.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Debugging incorrect memory usage</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -73,15 +69,19 @@
 <h1><a class="anchor" id="debugging_memory_usage_initialization"></a>
 Memory initialization</h1>
 <p>If you experience a bug with incorrect and nondeterministic data in your program and you suspect uninitialized memory to be used, you can enable automatic memory initialization to verify this. To do it, define macro <code>VMA_DEBUG_INITIALIZE_ALLOCATIONS</code> to 1.</p>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><p>It makes memory of all new allocations initialized to bit pattern <code>0xDCDCDCDC</code>. Before an allocation is destroyed, its memory is filled with bit pattern <code>0xEFEFEFEF</code>. Memory is automatically mapped and unmapped if necessary.</p>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1</span></div>
+<div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div>
+</div><!-- fragment --><p>It makes memory of all new allocations initialized to bit pattern <code>0xDCDCDCDC</code>. Before an allocation is destroyed, its memory is filled with bit pattern <code>0xEFEFEFEF</code>. Memory is automatically mapped and unmapped if necessary.</p>
 <p>If you find these values while debugging your program, good chances are that you incorrectly read Vulkan memory that is allocated but not initialized, or already freed, respectively.</p>
 <p>Memory initialization works only with memory types that are <code>HOST_VISIBLE</code>. It works also with dedicated allocations. It doesn't work with allocations created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag, as they cannot be mapped.</p>
 <h1><a class="anchor" id="debugging_memory_usage_margins"></a>
 Margins</h1>
 <p>By default, allocations are laid out in memory blocks next to each other if possible (considering required alignment, <code>bufferImageGranularity</code>, and <code>nonCoherentAtomSize</code>).</p>
-<img src="../gfx/Margins_1.png" alt="Allocations without margin" class="inline"/>
+<p><img src="../gfx/Margins_1.png" alt="Allocations without margin" class="inline"/></p>
 <p>Define macro <code>VMA_DEBUG_MARGIN</code> to some non-zero value (e.g. 16) to enforce specified number of bytes as a margin before and after every allocation.</p>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_MARGIN 16</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><img src="../gfx/Margins_2.png" alt="Allocations with margin" class="inline"/>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_MARGIN 16</span></div>
+<div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div>
+</div><!-- fragment --><p><img src="../gfx/Margins_2.png" alt="Allocations with margin" class="inline"/></p>
 <p>If your bug goes away after enabling margins, it means it may be caused by memory being overwritten outside of allocation boundaries. It is not 100% certain though. Change in application behavior may also be caused by different order and distribution of allocations across memory blocks after margins are applied.</p>
 <p>The margin is applied also before first and after last allocation in a block. It may occur only once between two adjacent allocations.</p>
 <p>Margins work with all types of memory.</p>
@@ -91,17 +91,20 @@
 <h1><a class="anchor" id="debugging_memory_usage_corruption_detection"></a>
 Corruption detection</h1>
 <p>You can additionally define macro <code>VMA_DEBUG_DETECT_CORRUPTION</code> to 1 to enable validation of contents of the margins.</p>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_MARGIN 16</span></div><div class="line"><span class="preprocessor">#define VMA_DEBUG_DETECT_CORRUPTION 1</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><p>When this feature is enabled, number of bytes specified as <code>VMA_DEBUG_MARGIN</code> (it must be multiply of 4) before and after every allocation is filled with a magic number. This idea is also know as "canary". Memory is automatically mapped and unmapped if necessary.</p>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_DEBUG_MARGIN 16</span></div>
+<div class="line"><span class="preprocessor">#define VMA_DEBUG_DETECT_CORRUPTION 1</span></div>
+<div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div>
+</div><!-- fragment --><p>When this feature is enabled, number of bytes specified as <code>VMA_DEBUG_MARGIN</code> (it must be multiply of 4) before and after every allocation is filled with a magic number. This idea is also know as "canary". Memory is automatically mapped and unmapped if necessary.</p>
 <p>This number is validated automatically when the allocation is destroyed. If it's not equal to the expected value, <code>VMA_ASSERT()</code> is executed. It clearly means that either CPU or GPU overwritten the memory outside of boundaries of the allocation, which indicates a serious bug.</p>
-<p>You can also explicitly request checking margins of all allocations in all memory blocks that belong to specified memory types by using function <a class="el" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98" title="Checks magic number in margins around all allocations in given memory types (in both default and cust...">vmaCheckCorruption()</a>, or in memory blocks that belong to specified custom pool, by using function <a class="el" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89" title="Checks magic number in margins around all allocations in given memory pool in search for corruptions.">vmaCheckPoolCorruption()</a>.</p>
+<p>You can also explicitly request checking margins of all allocations in all memory blocks that belong to specified memory types by using function <a class="el" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4" title="Checks magic number in margins around all allocations in given memory types (in both default and cust...">vmaCheckCorruption()</a>, or in memory blocks that belong to specified custom pool, by using function <a class="el" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02" title="Checks magic number in margins around all allocations in given memory pool in search for corruptions.">vmaCheckPoolCorruption()</a>.</p>
 <p>Margin validation (corruption detection) works only for memory types that are <code>HOST_VISIBLE</code> and <code>HOST_COHERENT</code>. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/defragmentation.html b/docs/html/defragmentation.html
index c180c52..6c2ee9c 100644
--- a/docs/html/defragmentation.html
+++ b/docs/html/defragmentation.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Defragmentation</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -70,15 +66,15 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>Interleaved allocations and deallocations of many objects of varying size can cause fragmentation over time, 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 defragmentation feature: structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a>, function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>, <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</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> blocks.</p>
+<p>To mitigate this problem, you can use defragmentation feature: structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a>, function <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>, <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" title="Ends defragmentation process.">vmaDefragmentationEnd()</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> blocks.</p>
 <p>What the defragmentation does is:</p>
 <ul>
-<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. 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,...">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.</li>
+<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. 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,...">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</li>
 <li>Moves actual data in memory.</li>
 </ul>
 <p>What it doesn't do, so you need to do it yourself:</p>
 <ul>
-<li>Recreate buffers and images that were bound to allocations that were defragmented and bind them with their new places in memory. You must use <code>vkDestroyBuffer()</code>, <code>vkDestroyImage()</code>, <code>vkCreateBuffer()</code>, <code>vkCreateImage()</code>, <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5" title="Binds image to allocation.">vmaBindImageMemory()</a> 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>, because you don't need to destroy or create allocation objects!</li>
+<li>Recreate buffers and images that were bound to allocations that were defragmented and bind them with their new places in memory. You must use <code>vkDestroyBuffer()</code>, <code>vkDestroyImage()</code>, <code>vkCreateBuffer()</code>, <code>vkCreateImage()</code>, <a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272" title="Binds image to allocation.">vmaBindImageMemory()</a> for that purpose and NOT <a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f" title="Destroys Vulkan image and frees allocated memory.">vmaDestroyImage()</a>, <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>, because you don't need to destroy or create allocation objects!</li>
 <li>Recreate views and update descriptors that point to these buffers and images.</li>
 </ul>
 <h1><a class="anchor" id="defragmentation_cpu"></a>
@@ -89,7 +85,47 @@
 <li>It temporarily maps entire memory blocks when necessary.</li>
 <li>It moves data using <code>memmove()</code> function.</li>
 </ul>
-<div class="fragment"><div class="line"><span class="comment">// Given following variables already initialized:</span></div><div class="line">VkDevice device;</div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">std::vector&lt;VkBuffer&gt; buffers;</div><div class="line">std::vector&lt;VmaAllocation&gt; allocations;</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">const</span> uint32_t allocCount = (uint32_t)allocations.size();</div><div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocCount);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> defragInfo = {};</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = allocCount;</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = allocations.data();</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = allocationsChanged.data();</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE; <span class="comment">// No limit.</span></div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX; <span class="comment">// No limit.</span></div><div class="line"></div><div class="line"><a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> defragCtx;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &amp;defragInfo, <span class="keyword">nullptr</span>, &amp;defragCtx);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(allocator, defragCtx);</div><div class="line"></div><div class="line"><span class="keywordflow">for</span>(uint32_t 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 buffer 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 to new memory region. Data contained in it is already moved.</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">        <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment --><p>Setting <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> is optional. This output array tells whether particular allocation in <a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> at the same index has been modified during defragmentation. You can pass null, but you then need to query every allocation passed to defragmentation for new parameters 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 might need to recreate and rebind a buffer or image associated with it.</p>
+<div class="fragment"><div class="line"><span class="comment">// Given following variables already initialized:</span></div>
+<div class="line">VkDevice device;</div>
+<div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div>
+<div class="line">std::vector&lt;VkBuffer&gt; buffers;</div>
+<div class="line">std::vector&lt;VmaAllocation&gt; allocations;</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="keyword">const</span> uint32_t allocCount = (uint32_t)allocations.size();</div>
+<div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocCount);</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> defragInfo = {};</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = allocCount;</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = allocations.data();</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = allocationsChanged.data();</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE; <span class="comment">// No limit.</span></div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX; <span class="comment">// No limit.</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> defragCtx;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a>(allocator, &amp;defragInfo, <span class="keyword">nullptr</span>, &amp;defragCtx);</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a>(allocator, defragCtx);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordflow">for</span>(uint32_t 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 buffer 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 to new memory region. Data contained in it is already moved.</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#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div>
+<div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div>
+<div class="line">    }</div>
+<div class="line">}</div>
+</div><!-- fragment --><p>Setting <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> is optional. This output array tells whether particular allocation in <a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> at the same index has been modified during defragmentation. You can pass null, but you then need to query every allocation passed to defragmentation for new parameters using <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you might need to recreate and rebind a buffer or image associated with it.</p>
 <p>If you use <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>, you can fill <a class="el" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d" title="Numer of pools in pPools array.">VmaDefragmentationInfo2::poolCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1" title="Either null or pointer to array of pools to be defragmented.">VmaDefragmentationInfo2::pPools</a> instead of <a class="el" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba" title="Number of allocations in pAllocations array.">VmaDefragmentationInfo2::allocationCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> to defragment all allocations in given pools. You cannot use <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> in that case. You can also combine both methods.</p>
 <h1><a class="anchor" id="defragmentation_gpu"></a>
 Defragmenting GPU memory</h1>
@@ -99,8 +135,59 @@
 <li>It issues <code>vkCmdCopyBuffer()</code> to passed command buffer.</li>
 </ul>
 <p>Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Given following variables already initialized:</span></div><div class="line">VkDevice device;</div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">VkCommandBuffer commandBuffer;</div><div class="line">std::vector&lt;VkBuffer&gt; buffers;</div><div class="line">std::vector&lt;VmaAllocation&gt; allocations;</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">const</span> uint32_t allocCount = (uint32_t)allocations.size();</div><div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocCount);</div><div class="line"></div><div class="line">VkCommandBufferBeginInfo cmdBufBeginInfo = ...;</div><div class="line">vkBeginCommandBuffer(commandBuffer, &amp;cmdBufBeginInfo);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> defragInfo = {};</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = allocCount;</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = allocations.data();</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = allocationsChanged.data();</div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a> = VK_WHOLE_SIZE; <span class="comment">// Notice it&#39;s &quot;GPU&quot; this time.</span></div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a> = UINT32_MAX; <span class="comment">// Notice it&#39;s &quot;GPU&quot; this time.</span></div><div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a> = commandBuffer;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> defragCtx;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &amp;defragInfo, <span class="keyword">nullptr</span>, &amp;defragCtx);</div><div class="line"></div><div class="line">vkEndCommandBuffer(commandBuffer);</div><div class="line"></div><div class="line"><span class="comment">// Submit commandBuffer.</span></div><div class="line"><span class="comment">// Wait for a fence that ensures commandBuffer execution finished.</span></div><div class="line"></div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(allocator, defragCtx);</div><div class="line"></div><div class="line"><span class="keywordflow">for</span>(uint32_t 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 buffer 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 to new memory region. Data contained in it is already moved.</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">        <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment --><p>You can combine these two methods by specifying non-zero <code>maxGpu*</code> as well as <code>maxCpu*</code> parameters. The library automatically chooses best method to defragment each memory pool.</p>
-<p>You may try not to block your entire program to wait until defragmentation finishes, but do it in the background, as long as you carefully fullfill requirements described in function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>.</p>
+<div class="fragment"><div class="line"><span class="comment">// Given following variables already initialized:</span></div>
+<div class="line">VkDevice device;</div>
+<div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div>
+<div class="line">VkCommandBuffer commandBuffer;</div>
+<div class="line">std::vector&lt;VkBuffer&gt; buffers;</div>
+<div class="line">std::vector&lt;VmaAllocation&gt; allocations;</div>
+<div class="line"> </div>
+<div class="line"> </div>
+<div class="line"><span class="keyword">const</span> uint32_t allocCount = (uint32_t)allocations.size();</div>
+<div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocCount);</div>
+<div class="line"> </div>
+<div class="line">VkCommandBufferBeginInfo cmdBufBeginInfo = ...;</div>
+<div class="line">vkBeginCommandBuffer(commandBuffer, &amp;cmdBufBeginInfo);</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> defragInfo = {};</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = allocCount;</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = allocations.data();</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = allocationsChanged.data();</div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a> = VK_WHOLE_SIZE; <span class="comment">// Notice it&#39;s &quot;GPU&quot; this time.</span></div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a> = UINT32_MAX; <span class="comment">// Notice it&#39;s &quot;GPU&quot; this time.</span></div>
+<div class="line">defragInfo.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a> = commandBuffer;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> defragCtx;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a>(allocator, &amp;defragInfo, <span class="keyword">nullptr</span>, &amp;defragCtx);</div>
+<div class="line"> </div>
+<div class="line">vkEndCommandBuffer(commandBuffer);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// Submit commandBuffer.</span></div>
+<div class="line"><span class="comment">// Wait for a fence that ensures commandBuffer execution finished.</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a>(allocator, defragCtx);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordflow">for</span>(uint32_t 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 buffer 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 to new memory region. Data contained in it is already moved.</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#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div>
+<div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div>
+<div class="line">    }</div>
+<div class="line">}</div>
+</div><!-- fragment --><p>You can combine these two methods by specifying non-zero <code>maxGpu*</code> as well as <code>maxCpu*</code> parameters. The library automatically chooses best method to defragment each memory pool.</p>
+<p>You may try not to block your entire program to wait until defragmentation finishes, but do it in the background, as long as you carefully fullfill requirements described in function <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>.</p>
 <h1><a class="anchor" id="defragmentation_additional_notes"></a>
 Additional notes</h1>
 <p>It is only legal to defragment allocations bound to:</p>
@@ -121,13 +208,29 @@
 <li>If you want to create a flag that would enable your algorithm or pass some additional flags to configure it, add them to <code>VmaDefragmentationFlagBits</code> and use them in <a class="el" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9" title="Reserved for future use. Should be 0.">VmaDefragmentationInfo2::flags</a>.</li>
 <li>Modify function <code>VmaBlockVectorDefragmentationContext::Begin</code> to create object of your new class whenever needed. </li>
 </ol>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3046</div></div>
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_a055cbf8d000a019a6270c66b46f0cb40"><div class="ttname"><a href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
+<div class="ttc" id="astruct_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:3095</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3109</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5e9d96ef2cbd8263cc523da91d1b40c9"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
+<div class="ttc" id="astruct_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:3040</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a696fc71963b7711cc0db3cc2225d0cd7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
+<div class="ttc" id="astruct_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:3100</div></div>
+<div class="ttc" id="astruct_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:3085</div></div>
+<div class="ttc" id="astruct_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:3061</div></div>
+<div class="ttc" id="astruct_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:2710</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae10b53588f197141c6e88a1f5ec34789"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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="astruct_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:3055</div></div>
+<div class="ttc" id="astruct_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:3090</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/deprecated.html b/docs/html/deprecated.html
index a5ae110..6791566 100644
--- a/docs/html/deprecated.html
+++ b/docs/html/deprecated.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -66,18 +66,18 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><dl class="reflist">
-<dt>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><a class="anchor" id="_deprecated000002"></a>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>Member <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">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><a class="anchor" id="_deprecated000002"></a>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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd>
 <dt>Member <a class="el" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>  </dt>
-<dd><a class="anchor" id="_deprecated000001"></a>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>
+<dd><a class="anchor" id="_deprecated000001"></a>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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd>
 </dl>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css
index e251592..5bc13aa 100644
--- a/docs/html/doxygen.css
+++ b/docs/html/doxygen.css
@@ -1,4 +1,4 @@
-/* The standard CSS for doxygen 1.8.15 */
+/* The standard CSS for doxygen 1.8.16 */
 
 body, table, div, p, dl {
 	font: 400 14px/22px Roboto,sans-serif;
@@ -53,11 +53,13 @@
 	font-weight: bold;
 }
 
-div.multicol {
+ul.multicol {
 	-moz-column-gap: 1em;
 	-webkit-column-gap: 1em;
+	column-gap: 1em;
 	-moz-column-count: 3;
 	-webkit-column-count: 3;
+	column-count: 3;
 }
 
 p.startli, p.startdd {
@@ -701,7 +703,7 @@
         padding-left: 0px;
 }       
 
-.params .paramname, .retval .paramname, .tparams .paramname {
+.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
         font-weight: bold;
         vertical-align: top;
 }
diff --git a/docs/html/files.html b/docs/html/files.html
index 3706d6d..6550542 100644
--- a/docs/html/files.html
+++ b/docs/html/files.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -75,7 +75,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/functions.html b/docs/html/functions.html
index be76f0e..51e062b 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -64,6 +64,9 @@
 <div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
 
 <h3><a id="index_a"></a>- a -</h3><ul>
+<li>allocationBytes
+: <a class="el" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">VmaBudget</a>
+</li>
 <li>allocationCount
 : <a class="el" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2</a>
 , <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
@@ -85,6 +88,9 @@
 
 
 <h3><a id="index_b"></a>- b -</h3><ul>
+<li>blockBytes
+: <a class="el" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">VmaBudget</a>
+</li>
 <li>blockCount
 : <a class="el" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats</a>
 , <a class="el" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo</a>
@@ -92,6 +98,9 @@
 <li>blockSize
 : <a class="el" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo</a>
 </li>
+<li>budget
+: <a class="el" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">VmaBudget</a>
+</li>
 <li>bytesFreed
 : <a class="el" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats</a>
 </li>
@@ -136,6 +145,13 @@
 </ul>
 
 
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>instance
+: <a class="el" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo</a>
+</li>
+</ul>
+
+
 <h3><a id="index_m"></a>- m -</h3><ul>
 <li>maxAllocationsToMove
 : <a class="el" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo</a>
@@ -288,6 +304,7 @@
 </li>
 <li>usage
 : <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo</a>
+, <a class="el" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">VmaBudget</a>
 </li>
 <li>usedBytes
 : <a class="el" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo</a>
@@ -353,7 +370,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html
index 36a6201..3c4840d 100644
--- a/docs/html/functions_vars.html
+++ b/docs/html/functions_vars.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Members - Variables</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -64,6 +64,9 @@
 &#160;
 
 <h3><a id="index_a"></a>- a -</h3><ul>
+<li>allocationBytes
+: <a class="el" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">VmaBudget</a>
+</li>
 <li>allocationCount
 : <a class="el" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2</a>
 , <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
@@ -85,6 +88,9 @@
 
 
 <h3><a id="index_b"></a>- b -</h3><ul>
+<li>blockBytes
+: <a class="el" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">VmaBudget</a>
+</li>
 <li>blockCount
 : <a class="el" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats</a>
 , <a class="el" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo</a>
@@ -92,6 +98,9 @@
 <li>blockSize
 : <a class="el" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo</a>
 </li>
+<li>budget
+: <a class="el" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">VmaBudget</a>
+</li>
 <li>bytesFreed
 : <a class="el" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats</a>
 </li>
@@ -136,6 +145,13 @@
 </ul>
 
 
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>instance
+: <a class="el" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo</a>
+</li>
+</ul>
+
+
 <h3><a id="index_m"></a>- m -</h3><ul>
 <li>maxAllocationsToMove
 : <a class="el" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo</a>
@@ -288,6 +304,7 @@
 </li>
 <li>usage
 : <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo</a>
+, <a class="el" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">VmaBudget</a>
 </li>
 <li>usedBytes
 : <a class="el" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo</a>
@@ -353,7 +370,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/general_considerations.html b/docs/html/general_considerations.html
index c3d4e24..7df6dec 100644
--- a/docs/html/general_considerations.html
+++ b/docs/html/general_considerations.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: General considerations</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -75,7 +71,7 @@
 <li>The library has no global state, so separate <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> objects can be used independently. There should be no need to create multiple such objects though - one per <code>VkDevice</code> is enough.</li>
 <li>By default, all calls to functions that take <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> as first parameter are safe to call from multiple threads simultaneously because they are synchronized internally when needed.</li>
 <li>When the allocator is created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d" title="Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> flag, calls to functions that take such <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must be synchronized externally.</li>
-<li>Access to a <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a> from different threads at the same time if you pass the same <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object to these functions.</li>
+<li>Access to a <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a> from different threads at the same time if you pass the same <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object to these functions.</li>
 </ul>
 <h1><a class="anchor" id="general_considerations_validation_layer_warnings"></a>
 Validation layer warnings</h1>
@@ -113,18 +109,18 @@
 <ul>
 <li>Data transfer. Uploading (straming) and downloading data of buffers and images between CPU and GPU memory and related synchronization is responsibility of the user. Defining some "texture" object that would automatically stream its data from a staging copy in CPU memory to GPU memory would rather be a feature of another, higher-level library implemented on top of VMA.</li>
 <li>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 should be made manually, using <code>vkCreateBuffer()</code> and <code>vkAllocateMemory()</code>.</li>
-<li>Recreation of buffers and images. Although the library has functions for buffer and image creation (<a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>), you need to recreate these objects yourself after defragmentation. That's because the big structures <code>VkBufferCreateInfo</code>, <code>VkImageCreateInfo</code> are not stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object.</li>
+<li>Recreation of buffers and images. Although the library has functions for buffer and image creation (<a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>), you need to recreate these objects yourself after defragmentation. That's because the big structures <code>VkBufferCreateInfo</code>, <code>VkImageCreateInfo</code> are not stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object.</li>
 <li>Handling CPU memory allocation failures. When dynamically creating small C++ objects in CPU memory (not Vulkan memory), allocation failures are not checked and handled gracefully, because that would complicate code significantly and is usually not needed in desktop PC applications anyway.</li>
 <li>Code free of any compiler warnings. Maintaining the library to compile and work correctly on so many different platforms is hard enough. Being free of any warnings, on any version of any compiler, is simply not feasible.</li>
 <li>This is a C++ library with C interface. Bindings or ports to any other programming languages are welcomed as external projects and are not going to be included into this repository. </li>
 </ul>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals.html b/docs/html/globals.html
index 5523d92..c9f9cdc 100644
--- a/docs/html/globals.html
+++ b/docs/html/globals.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -129,6 +129,12 @@
 <li>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">vk_mem_alloc.h</a>
 </li>
+<li>VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">vk_mem_alloc.h</a>
+</li>
+<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a>
+</li>
 <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a>
 </li>
@@ -144,12 +150,21 @@
 <li>VMA_BIND_MEMORY2
 : <a class="el" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d">vk_mem_alloc.h</a>
 </li>
+<li>VMA_CALL_POST
+: <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">vk_mem_alloc.h</a>
+</li>
+<li>VMA_CALL_PRE
+: <a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">vk_mem_alloc.h</a>
+</li>
 <li>VMA_DEDICATED_ALLOCATION
 : <a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">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_MEMORY_BUDGET
+: <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">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>
@@ -196,16 +211,16 @@
 : <a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryForBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryForImage()
-: <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryPages()
-: <a class="el" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vk_mem_alloc.h</a>
 </li>
 <li>VmaAllocationCreateFlagBits
 : <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">vk_mem_alloc.h</a>
@@ -229,52 +244,55 @@
 : <a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindBufferMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindBufferMemory2()
-: <a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindImageMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindImageMemory2()
-: <a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vk_mem_alloc.h</a>
+</li>
+<li>VmaBudget
+: <a class="el" href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">vk_mem_alloc.h</a>
 </li>
 <li>vmaBuildStatsString()
-: <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vk_mem_alloc.h</a>
 </li>
 <li>vmaCalculateStats()
-: <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vk_mem_alloc.h</a>
 </li>
 <li>vmaCheckCorruption()
-: <a class="el" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vk_mem_alloc.h</a>
 </li>
 <li>vmaCheckPoolCorruption()
-: <a class="el" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateAllocator()
-: <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateImage()
-: <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateLostAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreatePool()
-: <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragment()
-: <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragmentationBegin()
-: <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragmentationEnd()
-: <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vk_mem_alloc.h</a>
 </li>
 <li>VmaDefragmentationFlagBits
 : <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">vk_mem_alloc.h</a>
@@ -292,70 +310,73 @@
 : <a class="el" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyAllocator()
-: <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyImage()
-: <a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyPool()
-: <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vk_mem_alloc.h</a>
 </li>
 <li>VmaDeviceMemoryCallbacks
 : <a class="el" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndex()
-: <a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndexForBufferInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndexForImageInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vk_mem_alloc.h</a>
 </li>
 <li>vmaFlushAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeMemoryPages()
-: <a class="el" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeStatsString()
-: <a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetAllocationInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vk_mem_alloc.h</a>
+</li>
+<li>vmaGetBudget()
+: <a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetMemoryProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetMemoryTypeProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetPhysicalDeviceProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetPoolStats()
-: <a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vk_mem_alloc.h</a>
 </li>
 <li>vmaInvalidateAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">vk_mem_alloc.h</a>
 </li>
 <li>vmaMakePoolAllocationsLost()
-: <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vk_mem_alloc.h</a>
 </li>
 <li>vmaMapMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vk_mem_alloc.h</a>
 </li>
 <li>VmaMemoryUsage
-: <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d">vk_mem_alloc.h</a>
 </li>
 <li>VmaPoolCreateFlagBits
-: <a class="el" href="vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">vk_mem_alloc.h</a>
 </li>
 <li>VmaPoolCreateFlags
 : <a class="el" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">vk_mem_alloc.h</a>
@@ -376,13 +397,13 @@
 : <a class="el" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">vk_mem_alloc.h</a>
 </li>
 <li>vmaResizeAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vk_mem_alloc.h</a>
 </li>
 <li>vmaSetAllocationUserData()
-: <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vk_mem_alloc.h</a>
 </li>
 <li>vmaSetCurrentFrameIndex()
-: <a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vk_mem_alloc.h</a>
 </li>
 <li>VmaStatInfo
 : <a class="el" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">vk_mem_alloc.h</a>
@@ -391,10 +412,10 @@
 : <a class="el" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">vk_mem_alloc.h</a>
 </li>
 <li>vmaTouchAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vk_mem_alloc.h</a>
 </li>
 <li>vmaUnmapMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vk_mem_alloc.h</a>
 </li>
 <li>VmaVulkanFunctions
 : <a class="el" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">vk_mem_alloc.h</a>
@@ -405,7 +426,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html
index 1bdce46..dc2c143 100644
--- a/docs/html/globals_defs.html
+++ b/docs/html/globals_defs.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -68,9 +68,18 @@
 <li>VMA_BIND_MEMORY2
 : <a class="el" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d">vk_mem_alloc.h</a>
 </li>
+<li>VMA_CALL_POST
+: <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">vk_mem_alloc.h</a>
+</li>
+<li>VMA_CALL_PRE
+: <a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">vk_mem_alloc.h</a>
+</li>
 <li>VMA_DEDICATED_ALLOCATION
 : <a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">vk_mem_alloc.h</a>
 </li>
+<li>VMA_MEMORY_BUDGET
+: <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">vk_mem_alloc.h</a>
+</li>
 <li>VMA_RECORDING_ENABLED
 : <a class="el" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">vk_mem_alloc.h</a>
 </li>
@@ -83,7 +92,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html
index b685792..757c09b 100644
--- a/docs/html/globals_enum.html
+++ b/docs/html/globals_enum.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -86,7 +86,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html
index 127887a..854560b 100644
--- a/docs/html/globals_eval.html
+++ b/docs/html/globals_eval.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -112,6 +112,12 @@
 <li>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">vk_mem_alloc.h</a>
 </li>
+<li>VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">vk_mem_alloc.h</a>
+</li>
+<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a>
+</li>
 <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a>
 </li>
@@ -172,7 +178,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html
index eac5b52..ee15696 100644
--- a/docs/html/globals_func.html
+++ b/docs/html/globals_func.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -65,136 +65,139 @@
 
 <h3><a id="index_v"></a>- v -</h3><ul>
 <li>vmaAllocateMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryForBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryForImage()
-: <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vk_mem_alloc.h</a>
 </li>
 <li>vmaAllocateMemoryPages()
-: <a class="el" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindBufferMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindBufferMemory2()
-: <a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindImageMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vk_mem_alloc.h</a>
 </li>
 <li>vmaBindImageMemory2()
-: <a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vk_mem_alloc.h</a>
 </li>
 <li>vmaBuildStatsString()
-: <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vk_mem_alloc.h</a>
 </li>
 <li>vmaCalculateStats()
-: <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vk_mem_alloc.h</a>
 </li>
 <li>vmaCheckCorruption()
-: <a class="el" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vk_mem_alloc.h</a>
 </li>
 <li>vmaCheckPoolCorruption()
-: <a class="el" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateAllocator()
-: <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateImage()
-: <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreateLostAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vk_mem_alloc.h</a>
 </li>
 <li>vmaCreatePool()
-: <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragment()
-: <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragmentationBegin()
-: <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vk_mem_alloc.h</a>
 </li>
 <li>vmaDefragmentationEnd()
-: <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyAllocator()
-: <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyBuffer()
-: <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyImage()
-: <a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vk_mem_alloc.h</a>
 </li>
 <li>vmaDestroyPool()
-: <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndex()
-: <a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndexForBufferInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vk_mem_alloc.h</a>
 </li>
 <li>vmaFindMemoryTypeIndexForImageInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vk_mem_alloc.h</a>
 </li>
 <li>vmaFlushAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeMemoryPages()
-: <a class="el" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vk_mem_alloc.h</a>
 </li>
 <li>vmaFreeStatsString()
-: <a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetAllocationInfo()
-: <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vk_mem_alloc.h</a>
+</li>
+<li>vmaGetBudget()
+: <a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetMemoryProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetMemoryTypeProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetPhysicalDeviceProperties()
-: <a class="el" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vk_mem_alloc.h</a>
 </li>
 <li>vmaGetPoolStats()
-: <a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vk_mem_alloc.h</a>
 </li>
 <li>vmaInvalidateAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">vk_mem_alloc.h</a>
 </li>
 <li>vmaMakePoolAllocationsLost()
-: <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vk_mem_alloc.h</a>
 </li>
 <li>vmaMapMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vk_mem_alloc.h</a>
 </li>
 <li>vmaResizeAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vk_mem_alloc.h</a>
 </li>
 <li>vmaSetAllocationUserData()
-: <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vk_mem_alloc.h</a>
 </li>
 <li>vmaSetCurrentFrameIndex()
-: <a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vk_mem_alloc.h</a>
 </li>
 <li>vmaTouchAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vk_mem_alloc.h</a>
 </li>
 <li>vmaUnmapMemory()
-: <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vk_mem_alloc.h</a>
 </li>
 </ul>
 </div><!-- contents -->
@@ -202,7 +205,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/globals_type.html b/docs/html/globals_type.html
index 58c5d5c..ba083d9 100644
--- a/docs/html/globals_type.html
+++ b/docs/html/globals_type.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -89,6 +89,9 @@
 <li>VmaAllocatorCreateInfo
 : <a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">vk_mem_alloc.h</a>
 </li>
+<li>VmaBudget
+: <a class="el" href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">vk_mem_alloc.h</a>
+</li>
 <li>VmaDefragmentationFlagBits
 : <a class="el" href="vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f">vk_mem_alloc.h</a>
 </li>
@@ -146,7 +149,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/index.html b/docs/html/index.html
index d560ed5..89d7954 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Vulkan Memory Allocator</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -65,8 +65,8 @@
 <div class="title">Vulkan Memory Allocator </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p><b>Version 2.3.0-development</b> (2019-03-05)</p>
-<p>Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved. <br />
+<div class="textblock"><p><b>Version 2.3.0-development</b> (2019-11-02)</p>
+<p>Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. <br  />
 License: MIT</p>
 <p>Documentation of all members: <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a></p>
 <h1><a class="anchor" id="main_table_of_contents"></a>
@@ -94,6 +94,11 @@
 <li><a class="el" href="memory_mapping.html#memory_mapping_finding_if_memory_mappable">Finding out if memory is mappable</a></li>
 </ul>
 </li>
+<li><a class="el" href="staying_within_budget.html">Staying within budget</a><ul>
+<li><a class="el" href="staying_within_budget.html#staying_within_budget_querying_for_budget">Querying for budget</a></li>
+<li><a class="el" href="staying_within_budget.html#staying_within_budget_controlling_memory_usage">Controlling memory usage</a></li>
+</ul>
+</li>
 <li><a class="el" href="custom_memory_pools.html">Custom memory pools</a><ul>
 <li><a class="el" href="custom_memory_pools.html#custom_memory_pools_MemTypeIndex">Choosing memory type index</a></li>
 <li><a class="el" href="custom_memory_pools.html#linear_algorithm">Linear allocation algorithm</a><ul>
@@ -167,7 +172,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/jquery.js b/docs/html/jquery.js
index 1ee895c..103c32d 100644
--- a/docs/html/jquery.js
+++ b/docs/html/jquery.js
@@ -1,71 +1,26 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
+/*! jQuery UI - v1.12.1 - 2019-01-27
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
+},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+ * Copyright (c) 2007 Ariel Flesler - aflesler â—‹ gmail • com | https://github.com/flesler
+ * Licensed under MIT
+ * @author Ariel Flesler
+ * @version 2.1.2
+ */
+;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
 /*!
- * jQuery JavaScript Library v1.7.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Wed Mar 21 12:46:34 2012 -0700
- */
-(function(bd,L){var av=bd.document,bu=bd.navigator,bm=bd.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bd.jQuery,bH=bd.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bd.$===bF){bd.$=bH}if(b0&&bd.jQuery===bF){bd.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bd.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bd.attachEvent("onload",bF.ready);var b0=false;try{b0=bd.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0!=null&&b0==b0.window},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bd.JSON&&bd.JSON.parse){return bd.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){if(typeof b2!=="string"||!b2){return null}var b0,b1;try{if(bd.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bd.execScript||function(b1){bd["eval"].call(bd,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b6,b9,b7,b4,ca,b8){var b2,b5=b9==null,b3=0,b1=b0.length;if(b9&&typeof b9==="object"){for(b3 in b9){bF.access(b0,b6,b3,b9[b3],1,ca,b7)}b4=1}else{if(b7!==L){b2=b8===L&&bF.isFunction(b7);if(b5){if(b2){b2=b6;b6=function(cc,cb,cd){return b2.call(bF(cc),cd)}}else{b6.call(b0,b7);b6=null}}if(b6){for(;b3<b1;b3++){b6(b0[b3],b9,b2?b7.call(b0[b3],b3,b6(b0[b3],b9)):b7,b8)}}b4=1}}return b4?b0:b5?b6.call(b0):b1?b6(b0[0],b9):ca},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a3={};function X(e){var bv=a3[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bx){bx=bx?(a3[bx]||X(bx)):{};var bC=[],bD=[],by,e,bz,bw,bA,bB,bF=function(bG){var bH,bK,bJ,bI,bL;for(bH=0,bK=bG.length;bH<bK;bH++){bJ=bG[bH];bI=b.type(bJ);if(bI==="array"){bF(bJ)}else{if(bI==="function"){if(!bx.unique||!bE.has(bJ)){bC.push(bJ)}}}}},bv=function(bH,bG){bG=bG||[];by=!bx.memory||[bH,bG];e=true;bz=true;bB=bw||0;bw=0;bA=bC.length;for(;bC&&bB<bA;bB++){if(bC[bB].apply(bH,bG)===false&&bx.stopOnFalse){by=true;break}}bz=false;if(bC){if(!bx.once){if(bD&&bD.length){by=bD.shift();bE.fireWith(by[0],by[1])}}else{if(by===true){bE.disable()}else{bC=[]}}}},bE={add:function(){if(bC){var bG=bC.length;bF(arguments);if(bz){bA=bC.length}else{if(by&&by!==true){bw=bG;bv(by[0],by[1])}}}return this},remove:function(){if(bC){var bG=arguments,bI=0,bJ=bG.length;for(;bI<bJ;bI++){for(var bH=0;bH<bC.length;bH++){if(bG[bI]===bC[bH]){if(bz){if(bH<=bA){bA--;if(bH<=bB){bB--}}}bC.splice(bH--,1);if(bx.unique){break}}}}}return this},has:function(bH){if(bC){var bG=0,bI=bC.length;for(;bG<bI;bG++){if(bH===bC[bG]){return true}}}return false},empty:function(){bC=[];return this},disable:function(){bC=bD=by=L;return this},disabled:function(){return !bC},lock:function(){bD=L;if(!by||by===true){bE.disable()}return this},locked:function(){return !bD},fireWith:function(bH,bG){if(bD){if(bz){if(!bx.once){bD.push([bH,bG])}}else{if(!(bx.once&&by)){bv(bH,bG)}}}return this},fire:function(){bE.fireWith(this,arguments);return this},fired:function(){return !!e}};return bE};var aK=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aK.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aK.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aK.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bI,bH,bE,bF,bx,bD,bC,bz,bJ,bA,by,bw,bv=av.createElement("div"),bG=av.documentElement;bv.setAttribute("className","t");bv.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bH=bv.getElementsByTagName("*");bE=bv.getElementsByTagName("a")[0];if(!bH||!bH.length||!bE){return{}}bF=av.createElement("select");bx=bF.appendChild(av.createElement("option"));bD=bv.getElementsByTagName("input")[0];bI={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bE.getAttribute("style")),hrefNormalized:(bE.getAttribute("href")==="/a"),opacity:/^0.55/.test(bE.style.opacity),cssFloat:!!bE.style.cssFloat,checkOn:(bD.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,pixelMargin:true};b.boxModel=bI.boxModel=(av.compatMode==="CSS1Compat");bD.checked=true;bI.noCloneChecked=bD.cloneNode(true).checked;bF.disabled=true;bI.optDisabled=!bx.disabled;try{delete bv.test}catch(bB){bI.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bI.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bD=av.createElement("input");bD.value="t";bD.setAttribute("type","radio");bI.radioValue=bD.value==="t";bD.setAttribute("checked","checked");bD.setAttribute("name","t");bv.appendChild(bD);bC=av.createDocumentFragment();bC.appendChild(bv.lastChild);bI.checkClone=bC.cloneNode(true).cloneNode(true).lastChild.checked;bI.appendChecked=bD.checked;bC.removeChild(bD);bC.appendChild(bv);if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bA="on"+by;bw=(bA in bv);if(!bw){bv.setAttribute(bA,"return;");bw=(typeof bv[bA]==="function")}bI[by+"Bubbles"]=bw}}bC.removeChild(bv);bC=bF=bx=bv=bD=null;b(function(){var bM,bV,bW,bU,bO,bP,bR,bL,bK,bQ,bN,e,bT,bS=av.getElementsByTagName("body")[0];if(!bS){return}bL=1;bT="padding:0;margin:0;border:";bN="position:absolute;top:0;left:0;width:1px;height:1px;";e=bT+"0;visibility:hidden;";bK="style='"+bN+bT+"5px solid #000;";bQ="<div "+bK+"display:block;'><div style='"+bT+"0;display:block;overflow:hidden;'></div></div><table "+bK+"' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=e+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bS.insertBefore(bM,bS.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='"+bT+"0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bI.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);if(bd.getComputedStyle){bv.innerHTML="";bR=av.createElement("div");bR.style.width="0";bR.style.marginRight="0";bv.style.width="2px";bv.appendChild(bR);bI.reliableMarginRight=(parseInt((bd.getComputedStyle(bR,null)||{marginRight:0}).marginRight,10)||0)===0}if(typeof bv.style.zoom!=="undefined"){bv.innerHTML="";bv.style.width=bv.style.padding="1px";bv.style.border=0;bv.style.overflow="hidden";bv.style.display="inline";bv.style.zoom=1;bI.inlineBlockNeedsLayout=(bv.offsetWidth===3);bv.style.display="block";bv.style.overflow="visible";bv.innerHTML="<div style='width:5px;'></div>";bI.shrinkWrapBlocks=(bv.offsetWidth!==3)}bv.style.cssText=bN+e;bv.innerHTML=bQ;bV=bv.firstChild;bW=bV.firstChild;bO=bV.nextSibling.firstChild.firstChild;bP={doesNotAddBorder:(bW.offsetTop!==5),doesAddBorderForTableAndCells:(bO.offsetTop===5)};bW.style.position="fixed";bW.style.top="20px";bP.fixedPosition=(bW.offsetTop===20||bW.offsetTop===15);bW.style.position=bW.style.top="";bV.style.overflow="hidden";bV.style.position="relative";bP.subtractsBorderForOverflowNotVisible=(bW.offsetTop===-5);bP.doesNotIncludeMarginInBodyOffset=(bS.offsetTop!==bL);if(bd.getComputedStyle){bv.style.marginTop="1%";bI.pixelMargin=(bd.getComputedStyle(bv,null)||{marginTop:0}).marginTop!=="1%"}if(typeof bM.style.zoom!=="undefined"){bM.style.zoom=1}bS.removeChild(bM);bR=bv=bM=null;b.extend(bI,bP)});return bI})();var aT=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(bD,bC){var by,bv,bB,e,bx,bw=this[0],bA=0,bz=null;if(bD===L){if(this.length){bz=b.data(bw);if(bw.nodeType===1&&!b._data(bw,"parsedAttrs")){bB=bw.attributes;for(bx=bB.length;bA<bx;bA++){e=bB[bA].name;if(e.indexOf("data-")===0){e=b.camelCase(e.substring(5));a6(bw,e,bz[e])}}b._data(bw,"parsedAttrs",true)}}return bz}if(typeof bD==="object"){return this.each(function(){b.data(this,bD)})}by=bD.split(".",2);by[1]=by[1]?"."+by[1]:"";bv=by[1]+"!";return b.access(this,function(bE){if(bE===L){bz=this.triggerHandler("getData"+bv,[by[0]]);if(bz===L&&bw){bz=b.data(bw,bD);bz=a6(bw,bD,bz)}return bz===L&&by[1]?this.data(by[0]):bz}by[1]=bE;this.each(function(){var bF=b(this);bF.triggerHandler("setData"+bv,by);b.data(this,bD,bE);bF.triggerHandler("changeData"+bv,by)})},null,bC,arguments.length>1,null,false)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a6(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?+by:aT.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bj(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bj(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bj(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){var bw=2;if(typeof e!=="string"){bv=e;e="fx";bw--}if(arguments.length<bw){return b.queue(this[0],e)}return bv===L?this:this.each(function(){var bx=b.queue(this,e,bv);if(e==="fx"&&bx[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise(bw)}});var aQ=/[\n\t\r]/g,ag=/\s+/,aV=/\r/g,g=/^(?:button|input)$/i,C=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,E=b.support.getSetAttribute,bf,aZ,aG;b.fn.extend({attr:function(e,bv){return b.access(this,b.attr,e,bv,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,b.prop,e,bv,arguments.length>1)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(ag);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(ag);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aQ," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(ag);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aQ," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.type]||b.valHooks[bw.nodeName.toLowerCase()];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aV,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aZ:bf)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(by,bA){var bz,bB,bw,e,bv,bx=0;if(bA&&by.nodeType===1){bB=bA.toLowerCase().split(ag);e=bB.length;for(;bx<e;bx++){bw=bB[bx];if(bw){bz=b.propFix[bw]||bw;bv=ao.test(bw);if(!bv){b.attr(by,bw,"")}by.removeAttribute(E?bw:bz);if(bv&&bz in by){by[bz]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(bf&&b.nodeName(bv,"button")){return bf.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(bf&&b.nodeName(bv,"button")){return bf.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):C.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aZ={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!E){aG={name:true,id:true,coords:true};bf=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aG[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=bf.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:bf.get,set:function(bv,bw,e){if(bw===""){bw="false"}bf.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var be=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/(?:^|\s)hover(\.\S+)?\b/,aP=/^key/,bg=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler;by=bv.selector}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:by&&Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bd,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(bH){bH=b.event.fix(bH||bd.event);var bD=((b._data(this,"events")||{})[bH.type]||[]),bC=bD.delegateCount,bx=[].slice.call(arguments,0),bE=!bH.exclusive&&!bH.namespace,bz=b.event.special[bH.type]||{},bv=[],bJ,bG,by,bA,bK,bI,bB,bw,e,bF,bL;bx[0]=bH;bH.delegateTarget=this;if(bz.preDispatch&&bz.preDispatch.call(this,bH)===false){return}if(bC&&!(bH.button&&bH.type==="click")){bA=b(this);bA.context=this.ownerDocument||this;for(by=bH.target;by!=this;by=by.parentNode||this){if(by.disabled!==true){bI={};bw=[];bA[0]=by;for(bJ=0;bJ<bC;bJ++){e=bD[bJ];bF=e.selector;if(bI[bF]===L){bI[bF]=(e.quick?j(by,e.quick):bA.is(bF))}if(bI[bF]){bw.push(e)}}if(bw.length){bv.push({elem:by,matches:bw})}}}}if(bD.length>bC){bv.push({elem:this,matches:bD.slice(bC)})}for(bJ=0;bJ<bv.length&&!bH.isPropagationStopped();bJ++){bB=bv[bJ];bH.currentTarget=bB.elem;for(bG=0;bG<bB.matches.length&&!bH.isImmediatePropagationStopped();bG++){e=bB.matches[bG];if(bE||(!bH.namespace&&!e.namespace)||bH.namespace_re&&bH.namespace_re.test(e.namespace)){bH.data=e.data;bH.handleObj=e;bK=((b.event.special[e.origType]||{}).handle||e.handler).apply(bB.elem,bx);if(bK!==L){bH.result=bK;if(bK===false){bH.preventDefault();bH.stopPropagation()}}}}}if(bz.postDispatch){bz.postDispatch.call(this,bH)}return bH.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bl}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bl(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bl,isPropagationStopped:bl,isImmediatePropagationStopped:bl};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){e._submit_bubble=true});bv._submit_attached=true}})},postDispatch:function(e){if(e._submit_bubble){delete e._submit_bubble;if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}}},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(be.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(be.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return be.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=bz||e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bl}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on(bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.origType+"."+bv.namespace:bv.origType,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bl}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aP.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bg.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
-/*!
- * Sizzle CSS Selector Engine
- *  Copyright 2011, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9||e===11){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}bE.match.globalPOS=bD;var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,bb=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.globalPOS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aH(this,e,false),"not",e)},filter:function(e){return this.pushStack(aH(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(B(bx[0])||B(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||bb.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aH(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aS.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aS="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ah=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,v=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ai=new RegExp("<(?:"+aS+")[\\s/>]","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bn=/\/(java|ecma)script/i,aO=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){return b.access(this,function(bv){return bv===L?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(bv))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(e){return b.access(this,function(by){var bx=this[0]||{},bw=0,bv=this.length;if(by===L){return bx.nodeType===1?bx.innerHTML.replace(ah,""):null}if(typeof by==="string"&&!ae.test(by)&&(b.support.leadingWhitespace||!ar.test(by))&&!ax[(d.exec(by)||["",""])[1].toLowerCase()]){by=by.replace(R,"<$1></$2>");try{for(;bw<bv;bw++){bx=this[bw]||{};if(bx.nodeType===1){b.cleanData(bx.getElementsByTagName("*"));bx.innerHTML=by}}bx=0}catch(bz){}}if(bx){this.empty().append(by)}},null,e,arguments.length)},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?bc(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,function(bG,bH){if(bH.src){b.ajax({type:"GET",global:false,url:bH.src,async:false,dataType:"script"})}else{b.globalEval((bH.text||bH.textContent||bH.innerHTML||"").replace(aO,"/*$0*/"))}if(bH.parentNode){bH.parentNode.removeChild(bH)}})}}return this}});function bc(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function s(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by,bw[by][bx])}}}if(bz.data){bz.data=b.extend({},bz.data)}}function aj(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}else{if(bw==="script"&&e.text!==bv.text){e.text=bv.text}}}}}e.removeAttribute(b.expando);e.removeAttribute("_submit_attached");e.removeAttribute("_change_attached")}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ai.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bh(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function D(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function am(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||b.isXMLDoc(by)||!ai.test("<"+by.nodeName+">")?by.cloneNode(true):am(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){aj(by,bz);e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){if(bv[bx]){aj(e[bx],bv[bx])}}}if(bA){s(by,bz);if(bw){e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){s(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bI,bw,bv,bx){var bA,bH,bD,bJ=[];bw=bw||av;if(typeof bw.createElement==="undefined"){bw=bw.ownerDocument||bw[0]&&bw[0].ownerDocument||av}for(var bE=0,bG;(bG=bI[bE])!=null;bE++){if(typeof bG==="number"){bG+=""}if(!bG){continue}if(typeof bG==="string"){if(!W.test(bG)){bG=bw.createTextNode(bG)}else{bG=bG.replace(R,"<$1></$2>");var bN=(d.exec(bG)||["",""])[1].toLowerCase(),bz=ax[bN]||ax._default,bK=bz[0],bB=bw.createElement("div"),bL=ac.childNodes,bM;if(bw===av){ac.appendChild(bB)}else{a(bw).appendChild(bB)}bB.innerHTML=bz[1]+bG+bz[2];while(bK--){bB=bB.lastChild}if(!b.support.tbody){var by=v.test(bG),e=bN==="table"&&!by?bB.firstChild&&bB.firstChild.childNodes:bz[1]==="<table>"&&!by?bB.childNodes:[];for(bD=e.length-1;bD>=0;--bD){if(b.nodeName(e[bD],"tbody")&&!e[bD].childNodes.length){e[bD].parentNode.removeChild(e[bD])}}}if(!b.support.leadingWhitespace&&ar.test(bG)){bB.insertBefore(bw.createTextNode(ar.exec(bG)[0]),bB.firstChild)}bG=bB.childNodes;if(bB){bB.parentNode.removeChild(bB);if(bL.length>0){bM=bL[bL.length-1];if(bM&&bM.parentNode){bM.parentNode.removeChild(bM)}}}}}var bF;if(!b.support.appendChecked){if(bG[0]&&typeof(bF=bG.length)==="number"){for(bD=0;bD<bF;bD++){D(bG[bD])}}else{D(bG)}}if(bG.nodeType){bJ.push(bG)}else{bJ=b.merge(bJ,bG)}}if(bv){bA=function(bO){return !bO.type||bn.test(bO.type)};for(bE=0;bJ[bE];bE++){bH=bJ[bE];if(bx&&b.nodeName(bH,"script")&&(!bH.type||bn.test(bH.type))){bx.push(bH.parentNode?bH.parentNode.removeChild(bH):bH)}else{if(bH.nodeType===1){var bC=b.grep(bH.getElementsByTagName("script"),bA);bJ.splice.apply(bJ,[bE+1,0].concat(bC))}bv.appendChild(bH)}}}return bJ},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});var al=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,y=/([A-Z]|^ms)/g,bo=/^[\-+]?(?:\d*\.)?\d+$/i,a1=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,I=/^([\-+])=([\-+.\de]+)/,aE=/^margin/,a9={position:"absolute",visibility:"hidden",display:"block"},G=["Top","Right","Bottom","Left"],Z,aJ,aY;b.fn.css=function(e,bv){return b.access(this,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)},e,bv,arguments.length>1)};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(by,bx,bz){var e={},bw,bv;for(bv in bx){e[bv]=by.style[bv];by.style[bv]=bx[bv]}bw=bz.call(by);for(bv in bx){by.style[bv]=e[bv]}return bw}});b.curCSS=b.css;if(av.defaultView&&av.defaultView.getComputedStyle){aJ=function(bA,bw){var bv,bz,e,by,bx=bA.style;bw=bw.replace(y,"-$1").toLowerCase();if((bz=bA.ownerDocument.defaultView)&&(e=bz.getComputedStyle(bA,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(bA.ownerDocument.documentElement,bA)){bv=b.style(bA,bw)}}if(!b.support.pixelMargin&&e&&aE.test(bw)&&a1.test(bv)){by=bx.width;bx.width=bv;bv=e.width;bx.width=by}return bv}}if(av.documentElement.currentStyle){aY=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv==null&&bx&&(by=bx[bw])){bv=by}if(a1.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":bv;bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aJ||aY;function af(by,bw,bv){var bz=bw==="width"?by.offsetWidth:by.offsetHeight,bx=bw==="width"?1:0,e=4;if(bz>0){if(bv!=="border"){for(;bx<e;bx+=2){if(!bv){bz-=parseFloat(b.css(by,"padding"+G[bx]))||0}if(bv==="margin"){bz+=parseFloat(b.css(by,bv+G[bx]))||0}else{bz-=parseFloat(b.css(by,"border"+G[bx]+"Width"))||0}}}return bz+"px"}bz=Z(by,bw);if(bz<0||bz==null){bz=by.style[bw]}if(a1.test(bz)){return bz}bz=parseFloat(bz)||0;if(bv){for(;bx<e;bx+=2){bz+=parseFloat(b.css(by,"padding"+G[bx]))||0;if(bv!=="padding"){bz+=parseFloat(b.css(by,"border"+G[bx]+"Width"))||0}if(bv==="margin"){bz+=parseFloat(b.css(by,bv+G[bx]))||0}}}return bz+"px"}b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){if(bx){if(by.offsetWidth!==0){return af(by,e,bw)}else{return b.swap(by,a9,function(){return af(by,e,bw)})}}},set:function(bw,bx){return bo.test(bx)?bx+"px":bx}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(al,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=al.test(bw)?bw.replace(al,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bv,e){return b.swap(bv,{display:"inline-block"},function(){if(e){return Z(bv,"margin-right")}else{return bv.style.marginRight}})}}}});if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}b.each({margin:"",padding:"",border:"Width"},function(e,bv){b.cssHooks[e+bv]={expand:function(by){var bx,bz=typeof by==="string"?by.split(" "):[by],bw={};for(bx=0;bx<4;bx++){bw[e+G[bx]+bv]=bz[bx]||bz[bx-2]||bz[0]}return bw}}});var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,a0=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aN=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aR=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a7=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,z=b.fn.load,aa={},q={},aF,r,aW=["*/"]+["*"];try{aF=bm.href}catch(aw){aF=av.createElement("a");aF.href="";aF=aF.href}r=K.exec(aF.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aX(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aX(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aX(bv,bE,bz,bD,"*",bx)}return bC}function an(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&z){return z.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a7,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||a0.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){an(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}an(bv,e);return bv},ajaxSettings:{url:aF,isLocal:aN.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bd.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(q),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bk(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=F(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,r[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=r[1]||bI[2]!=r[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aX(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aR.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aW+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aX(q,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){u(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function u(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{u(bw+"["+(typeof bz==="object"?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&b.type(by)==="object"){for(var e in by){u(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bk(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function F(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),t=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=(typeof bD.data==="string")&&/^application\/x\-www\-form\-urlencoded/.test(bD.contentType);if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(t.test(bD.url)||bx&&t.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bd[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(t,bv);if(bD.url===e){if(bx){by=by.replace(t,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bd[bw]=function(bE){bB=[bE]};bC.always(function(){bd[bw]=bz;if(bB&&b.isFunction(bz)){bd[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var A=bd.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,x=0,N;function aM(){try{return new bd.XMLHttpRequest()}catch(bv){}}function ak(){try{return new bd.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bd.ActiveXObject?function(){return !this.isLocal&&aM()||ak()}:aM;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(A){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}try{bI.text=bA.responseText}catch(bK){}try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++x;if(A){if(!N){N={};b(bd).unload(A)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},ba,m,aB=/^(?:toggle|show|hide)$/,aU=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a4,aI=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a5;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a2("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if((by===""&&b.css(bw,"display")==="none")||!b.contains(bw.ownerDocument.documentElement,bw)){b._data(bw,"olddisplay",w(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a2("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a2("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bL=this.nodeType===1,bJ=bL&&b(this).is(":hidden"),bB,bG,bD,bK,bN,bF,bI,bC,bH,bM,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}if((bN=b.cssHooks[bB])&&"expand" in bN){bF=bN.expand(bz[bB]);delete bz[bB];for(bD in bF){if(!(bD in bz)){bz[bD]=bF[bD]}}}}for(bB in bz){bG=bz[bB];if(b.isArray(bG)){bE.animatedProperties[bB]=bG[1];bG=bz[bB]=bG[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bG==="hide"&&bJ||bG==="show"&&!bJ){return bE.complete.call(this)}if(bL&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||w(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bK=new b.fx(this,bE,bD);bG=bz[bD];if(aB.test(bG)){bA=b._data(this,"toggle"+bD)||(bG==="toggle"?bJ?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bK[bA]()}else{bK[bG]()}}else{bI=aU.exec(bG);bC=bK.cur();if(bI){bH=parseFloat(bI[2]);bM=bI[3]||(b.cssNumber[bD]?"":"px");if(bM!=="px"){b.style(this,bD,(bH||1)+bM);bC=((bH||1)/bK.cur())*bC;b.style(this,bD,bC+bM)}if(bI[1]){bH=((bI[1]==="-="?-1:1)*bH)+bC}bK.custom(bC,bH,bM)}else{bK.custom(bC,bG,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bi(){setTimeout(at,0);return(a5=b.now())}function at(){a5=L}function a2(bv,e){var bw={};b.each(aI.concat.apply([],aI.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a2("show",1),slideUp:a2("hide",1),slideToggle:a2("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(e){return e},swing:function(e){return(-Math.cos(e*Math.PI)/2)+0.5}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a5||bi();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(b._data(e.elem,"fxshow"+e.prop)===L){if(e.options.hide){b._data(e.elem,"fxshow"+e.prop,e.start)}else{if(e.options.show){b._data(e.elem,"fxshow"+e.prop,e.end)}}}};if(bv()&&b.timers.push(bv)&&!a4){a4=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a5||bi(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a4);a4=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(aI.concat.apply([],aI),function(e,bv){if(bv.indexOf("margin")){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function w(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!ba){ba=av.createElement("iframe");ba.frameBorder=ba.width=ba.height=0}e.appendChild(ba);if(!m||!ba.createElement){m=(ba.contentWindow||ba.contentDocument).document;m.write((b.support.boxModel?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(ba)}Q[bx]=bw}return Q[bx]}var a8,V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){a8=function(by,bH,bw,bB){try{bB=by.getBoundingClientRect()}catch(bF){}if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aL(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{a8=function(bz,bE,bx){var bC,bw=bz.offsetParent,bv=bz,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.fn.offset=function(e){if(arguments.length){return e===L?this:this.each(function(bx){b.offset.setOffset(this,e,bx)})}var bv=this[0],bw=bv&&bv.ownerDocument;if(!bw){return null}if(bv===bw.body){return b.offset.bodyOffset(bv)}return a8(bv,bw,bw.documentElement)};b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(bw,bv){var e=/Y/.test(bv);b.fn[bw]=function(bx){return b.access(this,function(by,bB,bA){var bz=aL(by);if(bA===L){return bz?(bv in bz)?bz[bv]:b.support.boxModel&&bz.document.documentElement[bB]||bz.document.body[bB]:by[bB]}if(bz){bz.scrollTo(!e?bA:b(bz).scrollLeft(),e?bA:b(bz).scrollTop())}else{by[bB]=bA}},bw,bx,arguments.length,null)}});function aL(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each({Height:"height",Width:"width"},function(bw,bx){var bv="client"+bw,e="scroll"+bw,by="offset"+bw;b.fn["inner"+bw]=function(){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,"padding")):this[bx]():null};b.fn["outer"+bw]=function(bA){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,bA?"margin":"border")):this[bx]():null};b.fn[bx]=function(bz){return b.access(this,function(bC,bB,bD){var bF,bE,bG,bA;if(b.isWindow(bC)){bF=bC.document;bE=bF.documentElement[bv];return b.support.boxModel&&bE||bF.body&&bF.body[bv]||bE}if(bC.nodeType===9){bF=bC.documentElement;if(bF[bv]>=bF[e]){return bF[bv]}return Math.max(bC.body[e],bF[e],bC.body[by],bF[by])}if(bD===L){bG=b.css(bC,bB);bA=parseFloat(bG);return b.isNumeric(bA)?bA:bG}b(bC).css(bB,bD)},bx,bz,arguments.length,null)}});bd.jQuery=bd.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*!
- * jQuery UI 1.8.18
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI
- */
-(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
- * jQuery UI Widget 1.8.18
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Widget
- */
-(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
- * jQuery UI Mouse 1.8.18
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Mouse
- *
- * Depends:
- *	jquery.ui.widget.js
- */
-(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
- * jQuery hashchange event - v1.3 - 7/21/2010
- * http://benalman.com/projects/jquery-hashchange-plugin/
- * 
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*!
- PowerTip - v1.2.0 - 2013-04-03
- http://stevenbenner.github.com/jquery-powertip/
- Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
+ PowerTip v1.3.1 (2018-04-15)
+ https://stevenbenner.github.io/jquery-powertip/
+ Copyright (c) 2018 Steven Benner (http://stevenbenner.com/).
  Released under MIT license.
  https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
 */
-(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));/*!
+(function(root,factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof module==="object"&&module.exports){module.exports=factory(require("jquery"))}else{factory(root.jQuery)}})(this,function($){var $document=$(document),$window=$(window),$body=$("body");var DATA_DISPLAYCONTROLLER="displayController",DATA_HASACTIVEHOVER="hasActiveHover",DATA_FORCEDOPEN="forcedOpen",DATA_HASMOUSEMOVE="hasMouseMove",DATA_MOUSEONTOTIP="mouseOnToPopup",DATA_ORIGINALTITLE="originalTitle",DATA_POWERTIP="powertip",DATA_POWERTIPJQ="powertipjq",DATA_POWERTIPTARGET="powertiptarget",EVENT_NAMESPACE=".powertip",RAD2DEG=180/Math.PI,MOUSE_EVENTS=["click","dblclick","mousedown","mouseup","mousemove","mouseover","mouseout","mouseenter","mouseleave","contextmenu"];var session={tooltips:null,isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,closeDelayTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var Collision={none:0,top:1,bottom:2,left:4,right:8};$.fn.powerTip=function(opts,arg){var targetElements=this,options,tipController;if(!targetElements.length){return targetElements}if($.type(opts)==="string"&&$.powerTip[opts]){return $.powerTip[opts].call(targetElements,targetElements,arg)}options=$.extend({},$.fn.powerTip.defaults,opts);tipController=new TooltipController(options);initTracking();targetElements.each(function elementSetup(){var $this=$(this),dataPowertip=$this.data(DATA_POWERTIP),dataElem=$this.data(DATA_POWERTIPJQ),dataTarget=$this.data(DATA_POWERTIPTARGET),title=$this.attr("title");if(!dataPowertip&&!dataTarget&&!dataElem&&title){$this.data(DATA_POWERTIP,title);$this.data(DATA_ORIGINALTITLE,title);$this.removeAttr("title")}$this.data(DATA_DISPLAYCONTROLLER,new DisplayController($this,options,tipController))});if(!options.manual){$.each(options.openEvents,function(idx,evt){if($.inArray(evt,options.closeEvents)>-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference<options.intentSensitivity){cancelClose();closeAnyDelayed();tipController.showTip(element)}else{session.previousX=session.currentX;session.previousY=session.currentY;openTooltip()}}function cancelTimer(stopClose){hoverTimer=clearTimeout(hoverTimer);if(session.closeDelayTimeout&&myCloseDelay===session.closeDelayTimeout||stopClose){cancelClose()}}function cancelClose(){session.closeDelayTimeout=clearTimeout(session.closeDelayTimeout);session.delayInProgress=false}function closeAnyDelayed(){if(session.delayInProgress&&session.activeHover&&!session.activeHover.is(element)){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide(true)}}function repositionTooltip(){tipController.resetPosition(element)}this.show=openTooltip;this.hide=closeTooltip;this.cancel=cancelTimer;this.resetPosition=repositionTooltip}function PlacementCalculator(){function computePlacementCoords(element,placement,tipWidth,tipHeight,offset){var placementBase=placement.split("-")[0],coords=new CSSCoordinates,position;if(isSvgElement(element)){position=getSvgPlacement(element,placementBase)}else{position=getHtmlPlacement(element,placementBase)}switch(placement){case"n":coords.set("left",position.left-tipWidth/2);coords.set("bottom",session.windowHeight-position.top+offset);break;case"e":coords.set("left",position.left+offset);coords.set("top",position.top-tipHeight/2);break;case"s":coords.set("left",position.left-tipWidth/2);coords.set("top",position.top+offset);break;case"w":coords.set("top",position.top-tipHeight/2);coords.set("right",session.windowWidth-position.left+offset);break;case"nw":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"nw-alt":coords.set("left",position.left);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne":coords.set("left",position.left-20);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne-alt":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left);break;case"sw":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"sw-alt":coords.set("left",position.left);coords.set("top",position.top+offset);break;case"se":coords.set("left",position.left-20);coords.set("top",position.top+offset);break;case"se-alt":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left);break}return coords}function getHtmlPlacement(element,placement){var objectOffset=element.offset(),objectWidth=element.outerWidth(),objectHeight=element.outerHeight(),left,top;switch(placement){case"n":left=objectOffset.left+objectWidth/2;top=objectOffset.top;break;case"e":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight/2;break;case"s":left=objectOffset.left+objectWidth/2;top=objectOffset.top+objectHeight;break;case"w":left=objectOffset.left;top=objectOffset.top+objectHeight/2;break;case"nw":left=objectOffset.left;top=objectOffset.top;break;case"ne":left=objectOffset.left+objectWidth;top=objectOffset.top;break;case"sw":left=objectOffset.left;top=objectOffset.top+objectHeight;break;case"se":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight;break}return{top:top,left:left}}function getSvgPlacement(element,placement){var svgElement=element.closest("svg")[0],domElement=element[0],point=svgElement.createSVGPoint(),boundingBox=domElement.getBBox(),matrix=domElement.getScreenCTM(),halfWidth=boundingBox.width/2,halfHeight=boundingBox.height/2,placements=[],placementKeys=["nw","n","ne","e","se","s","sw","w"],coords,rotation,steps,x;function pushPlacement(){placements.push(point.matrixTransform(matrix))}point.x=boundingBox.x;point.y=boundingBox.y;pushPlacement();point.x+=halfWidth;pushPlacement();point.x+=halfWidth;pushPlacement();point.y+=halfHeight;pushPlacement();point.y+=halfHeight;pushPlacement();point.x-=halfWidth;pushPlacement();point.x-=halfWidth;pushPlacement();point.y-=halfHeight;pushPlacement();if(placements[0].y!==placements[1].y||placements[0].x!==placements[7].x){rotation=Math.atan2(matrix.b,matrix.a)*RAD2DEG;steps=Math.ceil((rotation%360-22.5)/45);if(steps<1){steps+=8}while(steps--){placementKeys.push(placementKeys.shift())}}for(x=0;x<placements.length;x++){if(placementKeys[x]===placement){coords=placements[x];break}}return{top:coords.y+session.scrollTop,left:coords.x+session.scrollLeft}}this.compute=computePlacementCoords}function TooltipController(options){var placementCalculator=new PlacementCalculator,tipElement=$("#"+options.popupId);if(tipElement.length===0){tipElement=$("<div/>",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.top<viewportTop||Math.abs(coords.bottom-session.windowHeight)-elementHeight<viewportTop){collisions|=Collision.top}if(coords.top+elementHeight>viewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.left<viewportLeft||coords.right+elementWidth>viewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right<viewportLeft){collisions|=Collision.right}return collisions}function countFlags(value){var count=0;while(value){value&=value-1;count++}return count}return $.powerTip});/*!
  * jQuery UI Touch Punch 0.2.3
  *
  * Copyright 2011–2014, Dave Furfero
@@ -75,13 +30,6 @@
  *  jquery.ui.widget.js
  *  jquery.ui.mouse.js
  */
-(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return}var d=b.ui.mouse.prototype,f=d._mouseInit,c=d._mouseDestroy,a;function e(h,i){if(h.originalEvent.touches.length>1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*!
- * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
+!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017
  * http://www.smartmenus.org/
- *
- * Copyright Vasil Dinkov, Vadikom Web Ltd.
- * http://vadikom.com
- *
- * Licensed MIT
- */
-(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
\ No newline at end of file
+ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],$('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y<o.upEnd)&&a.eq(o.up?1:0).show(),o.y==n)mouse&&a.eq(o.up?0:1).hide(),this.menuScrollStop(t);else if(!e){this.opts.scrollAccelerate&&o.step<this.opts.scrollStep&&(o.step+=.2);var h=this;this.scrollTimeout=requestAnimationFrame(function(){h.menuScroll(t)})}},menuScrollMousewheel:function(t,e){if(this.getClosestMenu(e.target)==t[0]){e=e.originalEvent;var i=(e.wheelDelta||-e.detail)>0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});
\ No newline at end of file
diff --git a/docs/html/lost_allocations.html b/docs/html/lost_allocations.html
index 74b3b5e..f76a6e1 100644
--- a/docs/html/lost_allocations.html
+++ b/docs/html/lost_allocations.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Lost allocations</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -70,28 +66,75 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>If your game oversubscribes video memory, if may work OK in previous-generation graphics APIs (DirectX 9, 10, 11, OpenGL) because resources are automatically paged to system RAM. In Vulkan you can't do it because when you run out of memory, an allocation just fails. If you have more data (e.g. textures) that can fit into VRAM and you don't need it all at once, you may want to upload them to GPU on demand and "push out" ones that are not used for a long time to make room for the new ones, effectively using VRAM (or a cartain memory pool) as a form of cache. Vulkan Memory Allocator can help you with that by supporting a concept of "lost allocations".</p>
-<p>To create an allocation that can become lost, include <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>. Before using a buffer or image bound to such allocation in every new frame, you need to query it if it's not lost. To check it, call <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>. If the allocation is lost, you should not use it or buffer/image bound to it. You mustn't forget to destroy this allocation and this buffer/image. <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> can also be used for checking status of the allocation. Allocation is lost when returned <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> == <code>VK_NULL_HANDLE</code>.</p>
+<p>To create an allocation that can become lost, include <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>. Before using a buffer or image bound to such allocation in every new frame, you need to query it if it's not lost. To check it, call <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>. If the allocation is lost, you should not use it or buffer/image bound to it. You mustn't forget to destroy this allocation and this buffer/image. <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> can also be used for checking status of the allocation. Allocation is lost when returned <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> == <code>VK_NULL_HANDLE</code>.</p>
 <p>To create an allocation that can make some other allocations lost to make room for it, use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag. You will usually use both flags <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> at the same time.</p>
 <p>Warning! Current implementation uses quite naive, brute force algorithm, which can make allocation calls that use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag quite slow. A new, more optimal algorithm and data structure to speed this up is planned for the future.</p>
 <p><b>Q: When interleaving creation of new allocations with usage of existing ones, how do you make sure that an allocation won't become lost while it's used in the current frame?</b></p>
-<p>It is ensured because <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> not only returns allocation status/parameters and checks whether it's not lost, but when it's not, it also atomically marks it as used in the current frame, which makes it impossible to become lost in that frame. It uses lockless algorithm, so it works fast and doesn't involve locking any internal mutex.</p>
+<p>It is ensured because <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> not only returns allocation status/parameters and checks whether it's not lost, but when it's not, it also atomically marks it as used in the current frame, which makes it impossible to become lost in that frame. It uses lockless algorithm, so it works fast and doesn't involve locking any internal mutex.</p>
 <p><b>Q: What if my allocation may still be in use by the GPU when it's rendering a previous frame while I already submit new frame on the CPU?</b></p>
-<p>You can make sure that allocations "touched" by <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> will not become lost for a number of additional frames back from the current one by specifying this number as <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaAllocatorCreateInfo::frameInUseCount</a> (for default memory pool) and <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> (for custom pool).</p>
+<p>You can make sure that allocations "touched" by <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> will not become lost for a number of additional frames back from the current one by specifying this number as <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaAllocatorCreateInfo::frameInUseCount</a> (for default memory pool) and <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> (for custom pool).</p>
 <p><b>Q: How do you inform the library when new frame starts?</b></p>
-<p>You need to call function <a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236" title="Sets index of the current frame.">vmaSetCurrentFrameIndex()</a>.</p>
+<p>You need to call function <a class="el" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67" title="Sets index of the current frame.">vmaSetCurrentFrameIndex()</a>.</p>
 <p>Example code:</p>
-<div class="fragment"><div class="line"><span class="keyword">struct </span>MyBuffer</div><div class="line">{</div><div class="line">    VkBuffer m_Buf = <span class="keyword">nullptr</span>;</div><div class="line">    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_Alloc = <span class="keyword">nullptr</span>;</div><div class="line"></div><div class="line">    <span class="comment">// Called when the buffer is really needed in the current frame.</span></div><div class="line">    <span class="keywordtype">void</span> EnsureBuffer();</div><div class="line">};</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> MyBuffer::EnsureBuffer()</div><div class="line">{</div><div class="line">    <span class="comment">// Buffer has been created.</span></div><div class="line">    <span class="keywordflow">if</span>(m_Buf != VK_NULL_HANDLE)</div><div class="line">    {</div><div class="line">        <span class="comment">// Check if its allocation is not lost + mark it as used in current frame.</span></div><div class="line">        <span class="keywordflow">if</span>(<a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(allocator, m_Alloc))</div><div class="line">        {</div><div class="line">            <span class="comment">// It&#39;s all OK - safe to use m_Buf.</span></div><div class="line">            <span class="keywordflow">return</span>;</div><div class="line">        }</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">// Buffer not yet exists or lost - destroy and recreate it.</span></div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, m_Buf, m_Alloc);</div><div class="line"></div><div class="line">    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">    bufCreateInfo.size = 1024;</div><div class="line">    bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line">    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> |</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;m_Buf, &amp;m_Alloc, <span class="keyword">nullptr</span>);</div><div class="line">}</div></div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p>
-<p>You can create an allocation that is already in lost state from the beginning using function <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1" title="Creates new allocation that is in lost state from the beginning.">vmaCreateLostAllocation()</a>. It may be useful if you need a "dummy" allocation that is not null.</p>
-<p>You can call function <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024" title="Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...">vmaMakePoolAllocationsLost()</a> to set all eligible allocations in a specified custom pool to lost state. Allocations that have been "touched" in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> frames back cannot become lost.</p>
+<div class="fragment"><div class="line"><span class="keyword">struct </span>MyBuffer</div>
+<div class="line">{</div>
+<div class="line">    VkBuffer m_Buf = <span class="keyword">nullptr</span>;</div>
+<div class="line">    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_Alloc = <span class="keyword">nullptr</span>;</div>
+<div class="line"> </div>
+<div class="line">    <span class="comment">// Called when the buffer is really needed in the current frame.</span></div>
+<div class="line">    <span class="keywordtype">void</span> EnsureBuffer();</div>
+<div class="line">};</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span> MyBuffer::EnsureBuffer()</div>
+<div class="line">{</div>
+<div class="line">    <span class="comment">// Buffer has been created.</span></div>
+<div class="line">    <span class="keywordflow">if</span>(m_Buf != VK_NULL_HANDLE)</div>
+<div class="line">    {</div>
+<div class="line">        <span class="comment">// Check if its allocation is not lost + mark it as used in current frame.</span></div>
+<div class="line">        <span class="keywordflow">if</span>(<a class="code" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a>(allocator, m_Alloc))</div>
+<div class="line">        {</div>
+<div class="line">            <span class="comment">// It&#39;s all OK - safe to use m_Buf.</span></div>
+<div class="line">            <span class="keywordflow">return</span>;</div>
+<div class="line">        }</div>
+<div class="line">    }</div>
+<div class="line"> </div>
+<div class="line">    <span class="comment">// Buffer not yet exists or lost - destroy and recreate it.</span></div>
+<div class="line"> </div>
+<div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a>(allocator, m_Buf, m_Alloc);</div>
+<div class="line"> </div>
+<div class="line">    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">    bufCreateInfo.size = 1024;</div>
+<div class="line">    bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line">    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> |</div>
+<div class="line">        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div>
+<div class="line"> </div>
+<div class="line">    <a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;m_Buf, &amp;m_Alloc, <span class="keyword">nullptr</span>);</div>
+<div class="line">}</div>
+</div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p>
+<p>You can create an allocation that is already in lost state from the beginning using function <a class="el" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492" title="Creates new allocation that is in lost state from the beginning.">vmaCreateLostAllocation()</a>. It may be useful if you need a "dummy" allocation that is not null.</p>
+<p>You can call function <a class="el" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a" title="Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...">vmaMakePoolAllocationsLost()</a> to set all eligible allocations in a specified custom pool to lost state. Allocations that have been "touched" in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> frames back cannot become lost.</p>
 <p><b>Q: Can I touch allocation that cannot become lost?</b></p>
-<p>Yes, although it has no visible effect. Calls to <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> update last use frame index also for allocations that cannot become lost, but the only way to observe it is to dump internal allocator state using <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. You can use this feature for debugging purposes to explicitly mark allocations that you use in current frame and then analyze JSON dump to see for how long each allocation stays unused. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+<p>Yes, although it has no visible effect. Calls to <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> update last use frame index also for allocations that cannot become lost, but the only way to observe it is to dump internal allocator state using <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. You can use this feature for debugging purposes to explicitly mark allocations that you use in current frame and then analyze JSON dump to see for how long each allocation stays unused. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="avk__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:2326</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a05304fd2aa5736517feee653e1d579d1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a></div><div class="ttdeci">VMA_CALL_PRE VkBool32 VMA_CALL_POST 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="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_a3fa3daa743fcc950253f676aa8a323ea"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__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:2251</div></div>
+<div class="ttc" id="avk__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:2333</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="astruct_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:2396</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/memory_mapping.html b/docs/html/memory_mapping.html
index 184bfc9..33cc956 100644
--- a/docs/html/memory_mapping.html
+++ b/docs/html/memory_mapping.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Memory mapping</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -72,14 +68,47 @@
 <div class="textblock"><p>To "map memory" in Vulkan means to obtain a CPU pointer to <code>VkDeviceMemory</code>, to be able to read from it or write to it in CPU code. Mapping is possible only of memory allocated from a memory type that has <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag. Functions <code>vkMapMemory()</code>, <code>vkUnmapMemory()</code> are designed for this purpose. You can use them directly with memory allocated by this library, but it is not recommended because of following issue: Mapping the same <code>VkDeviceMemory</code> block multiple times is illegal - only one mapping at a time is allowed. This includes mapping disjoint regions. Mapping is not reference-counted internally by Vulkan. Because of this, Vulkan Memory Allocator provides following facilities:</p>
 <h1><a class="anchor" id="memory_mapping_mapping_functions"></a>
 Mapping functions</h1>
-<p>The library provides following functions for mapping of a specific <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. The way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a> function. Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div><div class="line"></div><div class="line"><span class="keyword">struct </span>ConstantBuffer</div><div class="line">{</div><div class="line">    ...</div><div class="line">};</div><div class="line">ConstantBuffer constantBufferData;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">VkBuffer constantBuffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> constantBufferAllocation;</div><div class="line"></div><div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div><div class="line"></div><div class="line"><span class="keywordtype">void</span>* mappedData;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div><div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div></div><!-- fragment --><p>When mapping, you may see a warning from Vulkan validation layer similar to this one:</p>
+<p>The library provides following functions for mapping of a specific <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>: <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. The way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a> function. Example:</p>
+<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div>
+<div class="line"> </div>
+<div class="line"><span class="keyword">struct </span>ConstantBuffer</div>
+<div class="line">{</div>
+<div class="line">    ...</div>
+<div class="line">};</div>
+<div class="line">ConstantBuffer constantBufferData;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div>
+<div class="line">VkBuffer constantBuffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> constantBufferAllocation;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div>
+<div class="line"> </div>
+<div class="line"><span class="keywordtype">void</span>* mappedData;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div>
+<div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div>
+</div><!-- fragment --><p>When mapping, you may see a warning from Vulkan validation layer similar to this one:</p>
 <p><em>Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.</em></p>
 <p>It happens because the library maps entire <code>VkDeviceMemory</code> block, where different types of images and buffers may end up together, especially on GPUs with unified memory like Intel. You can safely ignore it if you are sure you access only memory of the intended object that you wanted to map.</p>
 <h1><a class="anchor" id="memory_mapping_persistently_mapped_memory"></a>
 Persistently mapped memory</h1>
 <p>Kepping your memory persistently mapped is generally OK in Vulkan. You don't need to unmap it before using its data on the GPU. The library provides a special feature designed for that: Allocations made with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag set in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a> stay mapped all the time, so you can just access CPU pointer to it any time without a need to call any "map" or "unmap" function. Example:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div></div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div>
+<div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buf;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div>
+<div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
+</div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
 <ul>
 <li>When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2), device is discrete AMD GPU, and memory type is the special 256 MiB pool of <code>DEVICE_LOCAL + HOST_VISIBLE</code> memory (selected when you use <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>), then whenever a memory block allocated from this memory type stays mapped for the time of any call to <code>vkQueueSubmit()</code> or <code>vkQueuePresentKHR()</code>, this block is migrated by WDDM to system RAM, which degrades performance. It doesn't matter if that particular memory block is actually used by the command buffer being submitted.</li>
 <li>On Mac/MoltenVK there is a known bug - <a href="https://github.com/KhronosGroup/MoltenVK/issues/175">Issue #175</a> which requires unmapping before GPU can see updated texture.</li>
@@ -87,22 +116,91 @@
 </ul>
 <h1><a class="anchor" id="memory_mapping_cache_control"></a>
 Cache control</h1>
-<p>Memory in Vulkan doesn't need to be unmapped before using it on GPU, but unless a memory types has <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flag set, you need to manually invalidate cache before reading of mapped pointer and flush cache after writing to mapped pointer. Vulkan provides following functions for this purpose <code>vkFlushMappedMemoryRanges()</code>, <code>vkInvalidateMappedMemoryRanges()</code>, but this library provides more convenient functions that refer to given allocation object: <a class="el" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de" title="Flushes memory of given allocation.">vmaFlushAllocation()</a>, <a class="el" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006" title="Invalidates memory of given allocation.">vmaInvalidateAllocation()</a>.</p>
+<p>Memory in Vulkan doesn't need to be unmapped before using it on GPU, but unless a memory types has <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flag set, you need to manually invalidate cache before reading of mapped pointer and flush cache after writing to mapped pointer. Vulkan provides following functions for this purpose <code>vkFlushMappedMemoryRanges()</code>, <code>vkInvalidateMappedMemoryRanges()</code>, but this library provides more convenient functions that refer to given allocation object: <a class="el" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6" title="Flushes memory of given allocation.">vmaFlushAllocation()</a>, <a class="el" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c" title="Invalidates memory of given allocation.">vmaInvalidateAllocation()</a>.</p>
 <p>Regions of memory specified for flush/invalidate must be aligned to <code>VkPhysicalDeviceLimits::nonCoherentAtomSize</code>. This is automatically ensured by the library. In any memory type that is <code>HOST_VISIBLE</code> but not <code>HOST_COHERENT</code>, all allocations within blocks are aligned to this value, so their offsets are always multiply of <code>nonCoherentAtomSize</code> and two different allocations never share same "line" of this size.</p>
 <p>Please note that memory allocated with <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> is guaranteed to be <code>HOST_COHERENT</code>.</p>
 <p>Also, Windows drivers from all 3 PC GPU vendors (AMD, Intel, NVIDIA) currently provide <code>HOST_COHERENT</code> flag on all memory types that are <code>HOST_VISIBLE</code>, so on this platform you may not need to bother.</p>
 <h1><a class="anchor" id="memory_mapping_finding_if_memory_mappable"></a>
 Finding out if memory is mappable</h1>
 <p>It may happen that your allocation ends up in memory that is <code>HOST_VISIBLE</code> (available for mapping) despite it wasn't explicitly requested. For example, application may work on integrated graphics with unified memory (like Intel) or allocation from video memory might have failed, so the library chose system memory as fallback.</p>
-<p>You can detect this case and map such allocation to access its memory on CPU directly, instead of launching a transfer operation. In order to do that: inspect <code>allocInfo.memoryType</code>, call <a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca" title="Given Memory Type Index, returns Property Flags of this memory type.">vmaGetMemoryTypeProperties()</a>, and look for <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag in properties of that memory type.</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line">VkMemoryPropertyFlags memFlags;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div><div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in mappable memory. You can map it and access it directly.</span></div><div class="line">    <span class="keywordtype">void</span>* mappedData;</div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, alloc, &amp;mappedData);</div><div class="line">    memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, alloc);</div><div class="line">}</div><div class="line"><span class="keywordflow">else</span></div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div><div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div><div class="line">}</div></div><!-- fragment --><p>You can even use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> != <span class="keyword">nullptr</span>)</div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in mappable memory.</span></div><div class="line">    <span class="comment">// It&#39;s persistently mapped. You can access it directly.</span></div><div class="line">    memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line">}</div><div class="line"><span class="keywordflow">else</span></div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div><div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div><div class="line">}</div></div><!-- fragment --> </div></div><!-- PageDoc -->
-</div><!-- contents -->
+<p>You can detect this case and map such allocation to access its memory on CPU directly, instead of launching a transfer operation. In order to do that: inspect <code>allocInfo.memoryType</code>, call <a class="el" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1" title="Given Memory Type Index, returns Property Flags of this memory type.">vmaGetMemoryTypeProperties()</a>, and look for <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag in properties of that memory type.</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div>
+<div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buf;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
+<div class="line"> </div>
+<div class="line">VkMemoryPropertyFlags memFlags;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div>
+<div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line">{</div>
+<div class="line">    <span class="comment">// Allocation ended up in mappable memory. You can map it and access it directly.</span></div>
+<div class="line">    <span class="keywordtype">void</span>* mappedData;</div>
+<div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a>(allocator, alloc, &amp;mappedData);</div>
+<div class="line">    memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
+<div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a>(allocator, alloc);</div>
+<div class="line">}</div>
+<div class="line"><span class="keywordflow">else</span></div>
+<div class="line">{</div>
+<div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div>
+<div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div>
+<div class="line">}</div>
+</div><!-- fragment --><p>You can even use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div>
+<div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buf;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
+<div class="line"> </div>
+<div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> != <span class="keyword">nullptr</span>)</div>
+<div class="line">{</div>
+<div class="line">    <span class="comment">// Allocation ended up in mappable memory.</span></div>
+<div class="line">    <span class="comment">// It&#39;s persistently mapped. You can access it directly.</span></div>
+<div class="line">    memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
+<div class="line">}</div>
+<div class="line"><span class="keywordflow">else</span></div>
+<div class="line">{</div>
+<div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div>
+<div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div>
+<div class="line">}</div>
+</div><!-- fragment --> </div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_ae98119383e8e5754b6c09679386677d3"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3128786cae5f317f51307074a487c278"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="avk__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:2261</div></div>
+<div class="ttc" id="astruct_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="avk__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:2251</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad0b03b51a0dff5dab25ac9c194fef3e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:2743</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="astruct_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:2748</div></div>
+<div class="ttc" id="astruct_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:2715</div></div>
+<div class="ttc" id="avk__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:2313</div></div>
+<div class="ttc" id="astruct_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:2396</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
+<div class="ttc" id="astruct_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:2412</div></div>
+<div class="ttc" id="astruct_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:2710</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/menudata.js b/docs/html/menudata.js
index 34a4912..68ce88e 100644
--- a/docs/html/menudata.js
+++ b/docs/html/menudata.js
@@ -1,18 +1,17 @@
 /*
-@ @licstart  The following is the entire license notice for the
+@licstart  The following is the entire license notice for the
 JavaScript code in this file.
 
-Copyright (C) 1997-2017 by Dimitri van Heesch
+Copyright (C) 1997-2019 by Dimitri van Heesch
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+it under the terms of version 2 of the GNU General Public License as published by
+the Free Software Foundation
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU General Public License for more details.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
@@ -34,6 +33,7 @@
 {text:"c",url:"functions.html#index_c"},
 {text:"d",url:"functions.html#index_d"},
 {text:"f",url:"functions.html#index_f"},
+{text:"i",url:"functions.html#index_i"},
 {text:"m",url:"functions.html#index_m"},
 {text:"o",url:"functions.html#index_o"},
 {text:"p",url:"functions.html#index_p"},
@@ -48,6 +48,7 @@
 {text:"c",url:"functions_vars.html#index_c"},
 {text:"d",url:"functions_vars.html#index_d"},
 {text:"f",url:"functions_vars.html#index_f"},
+{text:"i",url:"functions_vars.html#index_i"},
 {text:"m",url:"functions_vars.html#index_m"},
 {text:"o",url:"functions_vars.html#index_o"},
 {text:"p",url:"functions_vars.html#index_p"},
diff --git a/docs/html/pages.html b/docs/html/pages.html
index 592407d..1fbad8f 100644
--- a/docs/html/pages.html
+++ b/docs/html/pages.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Related Pages</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -67,7 +67,22 @@
 <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>
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="quick_start.html" target="_self">Quick start</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="choosing_memory_type.html" target="_self">Choosing memory type</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="memory_mapping.html" target="_self">Memory mapping</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="staying_within_budget.html" target="_self">Staying within budget</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="custom_memory_pools.html" target="_self">Custom memory pools</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="defragmentation.html" target="_self">Defragmentation</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="lost_allocations.html" target="_self">Lost allocations</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="statistics.html" target="_self">Statistics</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="allocation_annotation.html" target="_self">Allocation names and user data</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="debugging_memory_usage.html" target="_self">Debugging incorrect memory usage</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="record_and_replay.html" target="_self">Record and replay</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="usage_patterns.html" target="_self">Recommended usage patterns</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="configuration.html" target="_self">Configuration</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="vk_khr_dedicated_allocation.html" target="_self">VK_KHR_dedicated_allocation</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a class="el" href="general_considerations.html" target="_self">General considerations</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><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 -->
@@ -75,7 +90,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/quick_start.html b/docs/html/quick_start.html
index 7bee943..9d04f15 100644
--- a/docs/html/quick_start.html
+++ b/docs/html/quick_start.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Quick start</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -78,7 +74,9 @@
 <li>Include "vk_mem_alloc.h" file in each CPP file where you want to use the library. This includes declarations of all members of the library.</li>
 <li>In exacly one CPP file define following macro before this include. It enables also internal definitions.</li>
 </ol>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><p>It may be a good idea to create dedicated CPP file just for this purpose.</p>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div>
+<div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div>
+</div><!-- fragment --><p>It may be a good idea to create dedicated CPP file just for this purpose.</p>
 <p>Note on language: This library is written in C++, but has C-compatible interface. Thus you can include and use <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a> in C or C++ code, but full implementation with <code>VMA_IMPLEMENTATION</code> macro must be compiled as C++, NOT as C.</p>
 <p>Please note that this library includes header <code>&lt;vulkan/vulkan.h&gt;</code>, which in turn includes <code>&lt;windows.h&gt;</code> on Windows. If you need some specific macros defined before including these headers (like <code>WIN32_LEAN_AND_MEAN</code> or <code>WINVER</code> for Windows, <code>VK_USE_PLATFORM_WIN32_KHR</code> for Vulkan), you must define them before every <code>#include</code> of this library.</p>
 <h1><a class="anchor" id="quick_start_initialization"></a>
@@ -86,24 +84,54 @@
 <p>At program startup:</p>
 <ol type="1">
 <li>Initialize Vulkan to have <code>VkPhysicalDevice</code> and <code>VkDevice</code> object.</li>
-<li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> structure and create <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object by calling <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a>.</li>
+<li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> structure and create <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object by calling <a class="el" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d" title="Creates Allocator object.">vmaCreateAllocator()</a>.</li>
 </ol>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div></div><!-- fragment --><h1><a class="anchor" id="quick_start_resource_allocation"></a>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div>
+<div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div>
+<div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div>
+</div><!-- fragment --><h1><a class="anchor" id="quick_start_resource_allocation"></a>
 Resource allocation</h1>
 <p>When you want to create a buffer or image:</p>
 <ol type="1">
 <li>Fill <code>VkBufferCreateInfo</code> / <code>VkImageCreateInfo</code> structure.</li>
 <li>Fill <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure.</li>
-<li>Call <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> / <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a> to get <code>VkBuffer</code>/<code>VkImage</code> with memory already allocated and bound to it.</li>
+<li>Call <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a> / <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a> to get <code>VkBuffer</code>/<code>VkImage</code> with memory already allocated and bound to it.</li>
 </ol>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p>
-<div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buffer, allocation);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(allocator);</div></div><!-- fragment --> </div></div><!-- PageDoc -->
-</div><!-- contents -->
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
+<div class="line">bufferInfo.size = 65536;</div>
+<div class="line">bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div>
+<div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line"> </div>
+<div class="line">VkBuffer buffer;</div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+</div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p>
+<div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a>(allocator, buffer, allocation);</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a>(allocator);</div>
+</div><!-- fragment --> </div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="astruct_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:1982</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a288d938ca902469760248ebd3633dde5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
+<div class="ttc" id="astruct_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="astruct_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:1976</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_a3fa3daa743fcc950253f676aa8a323ea"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af2bacace15ecc6886e4e4de5d1b77e4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+<div class="ttc" id="avk__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:2251</div></div>
+<div class="ttc" id="astruct_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:1985</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/record_and_replay.html b/docs/html/record_and_replay.html
index 388e862..33bf977 100644
--- a/docs/html/record_and_replay.html
+++ b/docs/html/record_and_replay.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Record and replay</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -80,7 +76,8 @@
 <h1><a class="anchor" id="record_and_replay_usage"></a>
 Usage</h1>
 <p>Recording functionality is disabled by default. To enable it, define following macro before every include of this library:</p>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_RECORDING_ENABLED 1</span></div></div><!-- fragment --><p><b>To record sequence of calls to a file:</b> Fill 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> member while creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. File is opened and written during whole lifetime of the allocator.</p>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_RECORDING_ENABLED 1</span></div>
+</div><!-- fragment --><p><b>To record sequence of calls to a file:</b> Fill 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> member while creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. File is opened and written during whole lifetime of the allocator.</p>
 <p><b>To replay file:</b> Use VmaReplay - standalone command-line program. Precompiled binary can be found in "bin" directory. Its source can be found in "src/VmaReplay" directory. Its project is generated by Premake. Command line syntax is printed when the program is launched without parameters. Basic usage: </p><pre class="fragment">VmaReplay.exe MyRecording.csv
 </pre><p><b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p>
 <h1><a class="anchor" id="record_and_replay_additional_considerations"></a>
@@ -89,13 +86,13 @@
 <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>
 </ul>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html
index 5330204..a52d5f0 100644
--- a/docs/html/search/all_0.html
+++ b/docs/html/search/all_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js
index 0efad17..f8addb4 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()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',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']]],
-  ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
+  ['allocation_20names_20and_20user_20data_0',['Allocation names and user data',['../allocation_annotation.html',1,'']]],
+  ['allocationbytes_1',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]],
+  ['allocationcount_2',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]],
+  ['allocationsizeavg_3',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
+  ['allocationsizemax_4',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
+  ['allocationsizemin_5',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
+  ['allocationsmoved_6',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html
index 2f46793..0fcb704 100644
--- a/docs/html/search/all_1.html
+++ b/docs/html/search/all_1.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js
index 7ae997e..0ac2341 100644
--- a/docs/html/search/all_1.js
+++ b/docs/html/search/all_1.js
@@ -1,7 +1,9 @@
 var searchData=
 [
-  ['blockcount',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
-  ['blocksize',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
-  ['bytesfreed',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
-  ['bytesmoved',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
+  ['blockbytes_7',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]],
+  ['blockcount_8',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
+  ['blocksize_9',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
+  ['budget_10',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]],
+  ['bytesfreed_11',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
+  ['bytesmoved_12',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html
index 170dc09..c234738 100644
--- a/docs/html/search/all_10.html
+++ b/docs/html/search/all_10.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_10.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js
index c3722a9..3536756 100644
--- a/docs/html/search/all_10.js
+++ b/docs/html/search/all_10.js
@@ -1,133 +1,11 @@
 var searchData=
 [
-  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
-  ['vk_5fmem_5falloc_2eh',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
-  ['vkallocatememory',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
-  ['vkbindbuffermemory',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
-  ['vkbindimagememory',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
-  ['vkcmdcopybuffer',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
-  ['vkcreatebuffer',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
-  ['vkcreateimage',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
-  ['vkdestroybuffer',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
-  ['vkdestroyimage',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
-  ['vkflushmappedmemoryranges',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
-  ['vkfreememory',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldevicememoryproperties',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldeviceproperties',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
-  ['vkinvalidatemappedmemoryranges',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
-  ['vkmapmemory',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
-  ['vkunmapmemory',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fmapped_5fbit',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmask',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',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_5fbind_5fmemory2',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
-  ['vma_5fdedicated_5fallocation',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',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_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5falgorithm_5fmask',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]],
-  ['vma_5frecording_5fenabled',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
-  ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememorypages',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
-  ['vmaallocation',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
-  ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocator',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
-  ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflags',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmabindbuffermemory',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory2',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory2',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
-  ['vmabuildstatsstring',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
-  ['vmacalculatestats',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
-  ['vmacheckcorruption',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
-  ['vmacheckpoolcorruption',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
-  ['vmacreateallocator',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
-  ['vmacreatebuffer',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
-  ['vmacreateimage',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
-  ['vmacreatelostallocation',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
-  ['vmacreatepool',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
-  ['vmadefragment',['vmaDefragment',['../vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]],
-  ['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']]],
-  ['vmadestroyimage',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
-  ['vmadestroypool',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
-  ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforbufferinfo',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforimageinfo',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocation',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de',1,'vk_mem_alloc.h']]],
-  ['vmafreememory',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]],
-  ['vmafreememorypages',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840',1,'vk_mem_alloc.h']]],
-  ['vmafreestatsstring',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
-  ['vmagetallocationinfo',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
-  ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
-  ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
-  ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolstats',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocation',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006',1,'vk_mem_alloc.h']]],
-  ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
-  ['vmamapmemory',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
-  ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
-  ['vmapool',['VmaPool',['../struct_vma_pool.html',1,'']]],
-  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
-  ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmarecordflags',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
-  ['vmarecordsettings',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'VmaRecordSettings():&#160;vk_mem_alloc.h']]],
-  ['vmaresizeallocation',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]],
-  ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
-  ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
-  ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
-  ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'VmaStats():&#160;vk_mem_alloc.h']]],
-  ['vmatouchallocation',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
-  ['vmaunmapmemory',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]],
-  ['vmavulkanfunctions',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h']]]
+  ['unusedbytes_71',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
+  ['unusedrangecount_72',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
+  ['unusedrangesizeavg_73',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
+  ['unusedrangesizemax_74',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
+  ['unusedrangesizemin_75',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
+  ['unusedsize_76',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
+  ['usage_77',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
+  ['usedbytes_78',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
 ];
diff --git a/docs/html/search/all_11.html b/docs/html/search/all_11.html
new file mode 100644
index 0000000..2f927fe
--- /dev/null
+++ b/docs/html/search/all_11.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+/* @license-end */
+--></script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js
new file mode 100644
index 0000000..ac3c021
--- /dev/null
+++ b/docs/html/search/all_11.js
@@ -0,0 +1,140 @@
+var searchData=
+[
+  ['vulkan_20memory_20allocator_79',['Vulkan Memory Allocator',['../index.html',1,'']]],
+  ['vk_5fkhr_5fdedicated_5fallocation_80',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'']]],
+  ['vk_5fmem_5falloc_2eh_81',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
+  ['vkallocatememory_82',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
+  ['vkbindbuffermemory_83',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
+  ['vkbindimagememory_84',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
+  ['vkcmdcopybuffer_85',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
+  ['vkcreatebuffer_86',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
+  ['vkcreateimage_87',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
+  ['vkdestroybuffer_88',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
+  ['vkdestroyimage_89',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
+  ['vkflushmappedmemoryranges_90',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
+  ['vkfreememory_91',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements_92',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements_93',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldevicememoryproperties_94',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldeviceproperties_95',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
+  ['vkinvalidatemappedmemoryranges_96',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
+  ['vkmapmemory_97',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
+  ['vkunmapmemory_98',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_99',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_100',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_101',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_102',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_103',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fmapped_5fbit_104',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_105',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_106',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_107',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_108',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_109',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_110',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_111',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_112',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_113',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_114',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_115',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_116',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_117',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_118',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_119',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_120',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
+  ['vma_5fbind_5fmemory2_121',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
+  ['vma_5fcall_5fpost_122',['VMA_CALL_POST',['../vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0',1,'vk_mem_alloc.h']]],
+  ['vma_5fcall_5fpre_123',['VMA_CALL_PRE',['../vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31',1,'vk_mem_alloc.h']]],
+  ['vma_5fdedicated_5fallocation_124',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_125',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fbudget_126',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fonly_127',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_128',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fonly_129',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_130',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fmax_5fenum_131',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5funknown_132',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5falgorithm_5fmask_133',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_134',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_135',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_136',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_137',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_138',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_139',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled_140',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
+  ['vma_5fstats_5fstring_5fenabled_141',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememory_142',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforbuffer_143',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforimage_144',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememorypages_145',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325',1,'vk_mem_alloc.h']]],
+  ['vmaallocation_146',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
+  ['vmaallocationcreateflagbits_147',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationcreateflags_148',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateinfo_149',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationinfo_150',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocator_151',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
+  ['vmaallocatorcreateflagbits_152',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflags_153',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateinfo_154',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmabindbuffermemory_155',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory2_156',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory_157',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory2_158',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb',1,'vk_mem_alloc.h']]],
+  ['vmabudget_159',['VmaBudget',['../struct_vma_budget.html',1,'VmaBudget'],['../vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38',1,'VmaBudget():&#160;vk_mem_alloc.h']]],
+  ['vmabuildstatsstring_160',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4',1,'vk_mem_alloc.h']]],
+  ['vmacalculatestats_161',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b',1,'vk_mem_alloc.h']]],
+  ['vmacheckcorruption_162',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4',1,'vk_mem_alloc.h']]],
+  ['vmacheckpoolcorruption_163',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02',1,'vk_mem_alloc.h']]],
+  ['vmacreateallocator_164',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d',1,'vk_mem_alloc.h']]],
+  ['vmacreatebuffer_165',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f',1,'vk_mem_alloc.h']]],
+  ['vmacreateimage_166',['vmaCreateImage',['../vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131',1,'vk_mem_alloc.h']]],
+  ['vmacreatelostallocation_167',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492',1,'vk_mem_alloc.h']]],
+  ['vmacreatepool_168',['vmaCreatePool',['../vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57',1,'vk_mem_alloc.h']]],
+  ['vmadefragment_169',['vmaDefragment',['../vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationbegin_170',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationcontext_171',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
+  ['vmadefragmentationend_172',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_173',['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_174',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo_175',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0',1,'VmaDefragmentationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo2_176',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29',1,'VmaDefragmentationInfo2():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationstats_177',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9',1,'VmaDefragmentationStats():&#160;vk_mem_alloc.h']]],
+  ['vmadestroyallocator_178',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5',1,'vk_mem_alloc.h']]],
+  ['vmadestroybuffer_179',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea',1,'vk_mem_alloc.h']]],
+  ['vmadestroyimage_180',['vmaDestroyImage',['../vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f',1,'vk_mem_alloc.h']]],
+  ['vmadestroypool_181',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849',1,'vk_mem_alloc.h']]],
+  ['vmadevicememorycallbacks_182',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindex_183',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforbufferinfo_184',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforimageinfo_185',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocation_186',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6',1,'vk_mem_alloc.h']]],
+  ['vmafreememory_187',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1',1,'vk_mem_alloc.h']]],
+  ['vmafreememorypages_188',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836',1,'vk_mem_alloc.h']]],
+  ['vmafreestatsstring_189',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9',1,'vk_mem_alloc.h']]],
+  ['vmagetallocationinfo_190',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789',1,'vk_mem_alloc.h']]],
+  ['vmagetbudget_191',['vmaGetBudget',['../vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0',1,'vk_mem_alloc.h']]],
+  ['vmagetmemoryproperties_192',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5',1,'vk_mem_alloc.h']]],
+  ['vmagetmemorytypeproperties_193',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1',1,'vk_mem_alloc.h']]],
+  ['vmagetphysicaldeviceproperties_194',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolstats_195',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocation_196',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c',1,'vk_mem_alloc.h']]],
+  ['vmamakepoolallocationslost_197',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a',1,'vk_mem_alloc.h']]],
+  ['vmamapmemory_198',['vmaMapMemory',['../vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_199',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
+  ['vmapool_200',['VmaPool',['../struct_vma_pool.html',1,'']]],
+  ['vmapoolcreateflagbits_201',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmapoolcreateflags_202',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateinfo_203',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmapoolstats_204',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflagbits_205',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflags_206',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings_207',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'VmaRecordSettings():&#160;vk_mem_alloc.h']]],
+  ['vmaresizeallocation_208',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e',1,'vk_mem_alloc.h']]],
+  ['vmasetallocationuserdata_209',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a',1,'vk_mem_alloc.h']]],
+  ['vmasetcurrentframeindex_210',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67',1,'vk_mem_alloc.h']]],
+  ['vmastatinfo_211',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
+  ['vmastats_212',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'VmaStats():&#160;vk_mem_alloc.h']]],
+  ['vmatouchallocation_213',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1',1,'vk_mem_alloc.h']]],
+  ['vmaunmapmemory_214',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278',1,'vk_mem_alloc.h']]],
+  ['vmavulkanfunctions_215',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h']]]
+];
diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html
index 4c33d85..19c530f 100644
--- a/docs/html/search/all_2.html
+++ b/docs/html/search/all_2.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js
index b3b5109..13bbae0 100644
--- a/docs/html/search/all_2.js
+++ b/docs/html/search/all_2.js
@@ -1,7 +1,7 @@
 var searchData=
 [
-  ['choosing_20memory_20type',['Choosing memory type',['../choosing_memory_type.html',1,'index']]],
-  ['commandbuffer',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]],
-  ['configuration',['Configuration',['../configuration.html',1,'index']]],
-  ['custom_20memory_20pools',['Custom memory pools',['../custom_memory_pools.html',1,'index']]]
+  ['choosing_20memory_20type_13',['Choosing memory type',['../choosing_memory_type.html',1,'']]],
+  ['commandbuffer_14',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]],
+  ['configuration_15',['Configuration',['../configuration.html',1,'']]],
+  ['custom_20memory_20pools_16',['Custom memory pools',['../custom_memory_pools.html',1,'']]]
 ];
diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html
index b634070..1ae887f 100644
--- a/docs/html/search/all_3.html
+++ b/docs/html/search/all_3.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js
index 715ca42..a65fae3 100644
--- a/docs/html/search/all_3.js
+++ b/docs/html/search/all_3.js
@@ -1,9 +1,9 @@
 var searchData=
 [
-  ['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']]]
+  ['debugging_20incorrect_20memory_20usage_17',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'']]],
+  ['defragmentation_18',['Defragmentation',['../defragmentation.html',1,'']]],
+  ['deprecated_20list_19',['Deprecated List',['../deprecated.html',1,'']]],
+  ['device_20',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo']]],
+  ['devicememory_21',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]],
+  ['devicememoryblocksfreed_22',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html
index dd062ae..14c90ef 100644
--- a/docs/html/search/all_4.html
+++ b/docs/html/search/all_4.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js
index 09f7db0..b144fa4 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()'],['../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()']]]
+  ['flags_23',['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_24',['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_5.html b/docs/html/search/all_5.html
index f0780fd..60fa53e 100644
--- a/docs/html/search/all_5.html
+++ b/docs/html/search/all_5.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js
index 93e8ffe..be805b0 100644
--- a/docs/html/search/all_5.js
+++ b/docs/html/search/all_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['general_20considerations',['General considerations',['../general_considerations.html',1,'index']]]
+  ['general_20considerations_25',['General considerations',['../general_considerations.html',1,'']]]
 ];
diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html
index 39b0f55..7180363 100644
--- a/docs/html/search/all_6.html
+++ b/docs/html/search/all_6.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js
index 2cd9042..f2a22fd 100644
--- a/docs/html/search/all_6.js
+++ b/docs/html/search/all_6.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
+  ['instance_26',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html
index 9cd0196..ee6d2e4 100644
--- a/docs/html/search/all_7.html
+++ b/docs/html/search/all_7.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js
index f9722b1..8ed581e 100644
--- a/docs/html/search/all_7.js
+++ b/docs/html/search/all_7.js
@@ -1,16 +1,4 @@
 var searchData=
 [
-  ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
-  ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
-  ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
-  ['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()']]],
-  ['memorytypebits',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]],
-  ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
-  ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]]
+  ['lost_20allocations_27',['Lost allocations',['../lost_allocations.html',1,'']]]
 ];
diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html
index 1e8fb9c..7829aa4 100644
--- a/docs/html/search/all_8.html
+++ b/docs/html/search/all_8.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js
index 8ba96ff..6ff3fb4 100644
--- a/docs/html/search/all_8.js
+++ b/docs/html/search/all_8.js
@@ -1,4 +1,16 @@
 var searchData=
 [
-  ['nominmax',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
+  ['maxallocationstomove_28',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
+  ['maxblockcount_29',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
+  ['maxbytestomove_30',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
+  ['maxcpuallocationstomove_31',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
+  ['maxcpubytestomove_32',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
+  ['maxgpuallocationstomove_33',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
+  ['maxgpubytestomove_34',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
+  ['memory_20mapping_35',['Memory mapping',['../memory_mapping.html',1,'']]],
+  ['memoryheap_36',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]],
+  ['memorytype_37',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]],
+  ['memorytypebits_38',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]],
+  ['memorytypeindex_39',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
+  ['minblockcount_40',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]]
 ];
diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html
index 27df366..e4242c7 100644
--- a/docs/html/search/all_9.html
+++ b/docs/html/search/all_9.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js
index c9c4229..f6fd5a7 100644
--- a/docs/html/search/all_9.js
+++ b/docs/html/search/all_9.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['offset',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
+  ['nominmax_41',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html
index 63f9254..47a4a78 100644
--- a/docs/html/search/all_a.html
+++ b/docs/html/search/all_a.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_a.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js
index 4a0d98b..ab34015 100644
--- a/docs/html/search/all_a.js
+++ b/docs/html/search/all_a.js
@@ -1,23 +1,4 @@
 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']]],
-  ['pfn_5fvmafreedevicememoryfunction',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]],
-  ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
-  ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
-  ['pheapsizelimit',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
-  ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
-  ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
-  ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
-  ['poolcount',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
-  ['ppools',['pPools',['../struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1',1,'VmaDefragmentationInfo2']]],
-  ['precordsettings',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
-  ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
-  ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
-  ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
-  ['pvulkanfunctions',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
+  ['offset_42',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
 ];
diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html
index 44ae3e4..1320a43 100644
--- a/docs/html/search/all_b.html
+++ b/docs/html/search/all_b.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_b.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js
index de761c9..d1a2afd 100644
--- a/docs/html/search/all_b.js
+++ b/docs/html/search/all_b.js
@@ -1,4 +1,23 @@
 var searchData=
 [
-  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
+  ['pallocationcallbacks_43',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations_44',['pAllocations',['../struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged_45',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
+  ['pdevicememorycallbacks_46',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath_47',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
+  ['pfn_5fvmaallocatedevicememoryfunction_48',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
+  ['pfn_5fvmafreedevicememoryfunction_49',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]],
+  ['pfnallocate_50',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
+  ['pfnfree_51',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
+  ['pheapsizelimit_52',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
+  ['physicaldevice_53',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
+  ['pmappeddata_54',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
+  ['pool_55',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['poolcount_56',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
+  ['ppools_57',['pPools',['../struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1',1,'VmaDefragmentationInfo2']]],
+  ['precordsettings_58',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
+  ['preferredflags_59',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
+  ['preferredlargeheapblocksize_60',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
+  ['puserdata_61',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
+  ['pvulkanfunctions_62',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html
index 3de1586..32a3a1b 100644
--- a/docs/html/search/all_c.html
+++ b/docs/html/search/all_c.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_c.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js
index f0c993f..7b83b43 100644
--- a/docs/html/search/all_c.js
+++ b/docs/html/search/all_c.js
@@ -1,6 +1,4 @@
 var searchData=
 [
-  ['record_20and_20replay',['Record and replay',['../record_and_replay.html',1,'index']]],
-  ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
-  ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
+  ['quick_20start_63',['Quick start',['../quick_start.html',1,'']]]
 ];
diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html
index a2d5bd7..a386096 100644
--- a/docs/html/search/all_d.html
+++ b/docs/html/search/all_d.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_d.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js
index e93f611..bd0b44a 100644
--- a/docs/html/search/all_d.js
+++ b/docs/html/search/all_d.js
@@ -1,5 +1,6 @@
 var searchData=
 [
-  ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]],
-  ['statistics',['Statistics',['../statistics.html',1,'index']]]
+  ['record_20and_20replay_64',['Record and replay',['../record_and_replay.html',1,'']]],
+  ['requiredflags_65',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
+  ['recommended_20usage_20patterns_66',['Recommended usage patterns',['../usage_patterns.html',1,'']]]
 ];
diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html
index f9a056d..2931618 100644
--- a/docs/html/search/all_e.html
+++ b/docs/html/search/all_e.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_e.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js
index f8fbe3d..692377f 100644
--- a/docs/html/search/all_e.js
+++ b/docs/html/search/all_e.js
@@ -1,4 +1,6 @@
 var searchData=
 [
-  ['total',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
+  ['size_67',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]],
+  ['statistics_68',['Statistics',['../statistics.html',1,'']]],
+  ['staying_20within_20budget_69',['Staying within budget',['../staying_within_budget.html',1,'']]]
 ];
diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html
index f6997fa..ca42a52 100644
--- a/docs/html/search/all_f.html
+++ b/docs/html/search/all_f.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_f.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js
index bb52d7a..adc9a94 100644
--- a/docs/html/search/all_f.js
+++ b/docs/html/search/all_f.js
@@ -1,11 +1,4 @@
 var searchData=
 [
-  ['unusedbytes',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
-  ['unusedrangecount',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
-  ['unusedrangesizeavg',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
-  ['unusedrangesizemax',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
-  ['unusedrangesizemin',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
-  ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
-  ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]],
-  ['usedbytes',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
+  ['total_70',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
 ];
diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html
index b3c6ec6..d585e6a 100644
--- a/docs/html/search/classes_0.html
+++ b/docs/html/search/classes_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="classes_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js
index 72076b0..37dd94e 100644
--- a/docs/html/search/classes_0.js
+++ b/docs/html/search/classes_0.js
@@ -1,20 +1,21 @@
 var searchData=
 [
-  ['vmaallocation',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
-  ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]],
-  ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
-  ['vmaallocator',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
-  ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
-  ['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,'']]],
-  ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
-  ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
-  ['vmarecordsettings',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
-  ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
-  ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'']]],
-  ['vmavulkanfunctions',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
+  ['vmaallocation_216',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
+  ['vmaallocationcreateinfo_217',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]],
+  ['vmaallocationinfo_218',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
+  ['vmaallocator_219',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
+  ['vmaallocatorcreateinfo_220',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
+  ['vmabudget_221',['VmaBudget',['../struct_vma_budget.html',1,'']]],
+  ['vmadefragmentationcontext_222',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
+  ['vmadefragmentationinfo_223',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
+  ['vmadefragmentationinfo2_224',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]],
+  ['vmadefragmentationstats_225',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]],
+  ['vmadevicememorycallbacks_226',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]],
+  ['vmapool_227',['VmaPool',['../struct_vma_pool.html',1,'']]],
+  ['vmapoolcreateinfo_228',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
+  ['vmapoolstats_229',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
+  ['vmarecordsettings_230',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
+  ['vmastatinfo_231',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
+  ['vmastats_232',['VmaStats',['../struct_vma_stats.html',1,'']]],
+  ['vmavulkanfunctions_233',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
 ];
diff --git a/docs/html/search/defines_0.html b/docs/html/search/defines_0.html
index dbe0642..8fb07b8 100644
--- a/docs/html/search/defines_0.html
+++ b/docs/html/search/defines_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="defines_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/defines_0.js b/docs/html/search/defines_0.js
index 8ba96ff..277f366 100644
--- a/docs/html/search/defines_0.js
+++ b/docs/html/search/defines_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['nominmax',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
+  ['nominmax_427',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/defines_1.html b/docs/html/search/defines_1.html
index 7af9324..2858dbe 100644
--- a/docs/html/search/defines_1.html
+++ b/docs/html/search/defines_1.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="defines_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/defines_1.js b/docs/html/search/defines_1.js
index 597da07..12e720f 100644
--- a/docs/html/search/defines_1.js
+++ b/docs/html/search/defines_1.js
@@ -1,7 +1,10 @@
 var searchData=
 [
-  ['vma_5fbind_5fmemory2',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
-  ['vma_5fdedicated_5fallocation',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
-  ['vma_5frecording_5fenabled',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
-  ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]]
+  ['vma_5fbind_5fmemory2_428',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
+  ['vma_5fcall_5fpost_429',['VMA_CALL_POST',['../vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0',1,'vk_mem_alloc.h']]],
+  ['vma_5fcall_5fpre_430',['VMA_CALL_PRE',['../vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31',1,'vk_mem_alloc.h']]],
+  ['vma_5fdedicated_5fallocation_431',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fbudget_432',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled_433',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
+  ['vma_5fstats_5fstring_5fenabled_434',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/enums_0.html b/docs/html/search/enums_0.html
index 7040a9c..ae7a884 100644
--- a/docs/html/search/enums_0.html
+++ b/docs/html/search/enums_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="enums_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js
index d6d3bba..433c013 100644
--- a/docs/html/search/enums_0.js
+++ b/docs/html/search/enums_0.js
@@ -1,9 +1,9 @@
 var searchData=
 [
-  ['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']]]
+  ['vmaallocationcreateflagbits_385',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflagbits_386',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_387',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_388',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflagbits_389',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits_390',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/enumvalues_0.html b/docs/html/search/enumvalues_0.html
index 78895c7..1c0bbf9 100644
--- a/docs/html/search/enumvalues_0.html
+++ b/docs/html/search/enumvalues_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="enumvalues_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js
index 98e73f3..14dc76a 100644
--- a/docs/html/search/enumvalues_0.js
+++ b/docs/html/search/enumvalues_0.js
@@ -1,37 +1,39 @@
 var searchData=
 [
-  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fmapped_5fbit',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmask',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',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_5fflag_5fbits_5fmax_5fenum',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5falgorithm_5fmask',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]]
+  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_391',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_392',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_393',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_394',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_395',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fmapped_5fbit_396',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_397',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_398',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_399',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_400',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_401',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_402',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_403',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_404',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_405',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_406',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_407',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_408',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_409',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_410',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_411',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_412',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_413',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fonly_414',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_415',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fonly_416',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_417',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fmax_5fenum_418',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5funknown_419',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5falgorithm_5fmask_420',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_421',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_422',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_423',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_424',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_425',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_426',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/files_0.html b/docs/html/search/files_0.html
index 40cd455..de151d5 100644
--- a/docs/html/search/files_0.html
+++ b/docs/html/search/files_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="files_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js
index aeac70c..caf99ff 100644
--- a/docs/html/search/files_0.js
+++ b/docs/html/search/files_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['vk_5fmem_5falloc_2eh',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]]
+  ['vk_5fmem_5falloc_2eh_234',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]]
 ];
diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html
index bc73761..8a729f7 100644
--- a/docs/html/search/functions_0.html
+++ b/docs/html/search/functions_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="functions_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js
index 746638b..a9d6723 100644
--- a/docs/html/search/functions_0.js
+++ b/docs/html/search/functions_0.js
@@ -1,47 +1,48 @@
 var searchData=
 [
-  ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememorypages',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory2',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory2',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
-  ['vmabuildstatsstring',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
-  ['vmacalculatestats',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
-  ['vmacheckcorruption',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
-  ['vmacheckpoolcorruption',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
-  ['vmacreateallocator',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
-  ['vmacreatebuffer',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
-  ['vmacreateimage',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
-  ['vmacreatelostallocation',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
-  ['vmacreatepool',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
-  ['vmadefragment',['vmaDefragment',['../vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]],
-  ['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']]],
-  ['vmadestroypool',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforbufferinfo',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforimageinfo',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocation',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de',1,'vk_mem_alloc.h']]],
-  ['vmafreememory',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]],
-  ['vmafreememorypages',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840',1,'vk_mem_alloc.h']]],
-  ['vmafreestatsstring',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
-  ['vmagetallocationinfo',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
-  ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
-  ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
-  ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolstats',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocation',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006',1,'vk_mem_alloc.h']]],
-  ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
-  ['vmamapmemory',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
-  ['vmaresizeallocation',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]],
-  ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
-  ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
-  ['vmatouchallocation',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
-  ['vmaunmapmemory',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]]
+  ['vmaallocatememory_235',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforbuffer_236',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforimage_237',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememorypages_238',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory_239',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory2_240',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory_241',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory2_242',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb',1,'vk_mem_alloc.h']]],
+  ['vmabuildstatsstring_243',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4',1,'vk_mem_alloc.h']]],
+  ['vmacalculatestats_244',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b',1,'vk_mem_alloc.h']]],
+  ['vmacheckcorruption_245',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4',1,'vk_mem_alloc.h']]],
+  ['vmacheckpoolcorruption_246',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02',1,'vk_mem_alloc.h']]],
+  ['vmacreateallocator_247',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d',1,'vk_mem_alloc.h']]],
+  ['vmacreatebuffer_248',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f',1,'vk_mem_alloc.h']]],
+  ['vmacreateimage_249',['vmaCreateImage',['../vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131',1,'vk_mem_alloc.h']]],
+  ['vmacreatelostallocation_250',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492',1,'vk_mem_alloc.h']]],
+  ['vmacreatepool_251',['vmaCreatePool',['../vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57',1,'vk_mem_alloc.h']]],
+  ['vmadefragment_252',['vmaDefragment',['../vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationbegin_253',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationend_254',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9',1,'vk_mem_alloc.h']]],
+  ['vmadestroyallocator_255',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5',1,'vk_mem_alloc.h']]],
+  ['vmadestroybuffer_256',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea',1,'vk_mem_alloc.h']]],
+  ['vmadestroyimage_257',['vmaDestroyImage',['../vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f',1,'vk_mem_alloc.h']]],
+  ['vmadestroypool_258',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindex_259',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforbufferinfo_260',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforimageinfo_261',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocation_262',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6',1,'vk_mem_alloc.h']]],
+  ['vmafreememory_263',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1',1,'vk_mem_alloc.h']]],
+  ['vmafreememorypages_264',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836',1,'vk_mem_alloc.h']]],
+  ['vmafreestatsstring_265',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9',1,'vk_mem_alloc.h']]],
+  ['vmagetallocationinfo_266',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789',1,'vk_mem_alloc.h']]],
+  ['vmagetbudget_267',['vmaGetBudget',['../vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0',1,'vk_mem_alloc.h']]],
+  ['vmagetmemoryproperties_268',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5',1,'vk_mem_alloc.h']]],
+  ['vmagetmemorytypeproperties_269',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1',1,'vk_mem_alloc.h']]],
+  ['vmagetphysicaldeviceproperties_270',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolstats_271',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocation_272',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c',1,'vk_mem_alloc.h']]],
+  ['vmamakepoolallocationslost_273',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a',1,'vk_mem_alloc.h']]],
+  ['vmamapmemory_274',['vmaMapMemory',['../vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3',1,'vk_mem_alloc.h']]],
+  ['vmaresizeallocation_275',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e',1,'vk_mem_alloc.h']]],
+  ['vmasetallocationuserdata_276',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a',1,'vk_mem_alloc.h']]],
+  ['vmasetcurrentframeindex_277',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67',1,'vk_mem_alloc.h']]],
+  ['vmatouchallocation_278',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1',1,'vk_mem_alloc.h']]],
+  ['vmaunmapmemory_279',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html
index 3d06b05..32cbf49 100644
--- a/docs/html/search/pages_0.html
+++ b/docs/html/search/pages_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js
index 703dee4..7f72eb0 100644
--- a/docs/html/search/pages_0.js
+++ b/docs/html/search/pages_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['allocation_20names_20and_20user_20data',['Allocation names and user data',['../allocation_annotation.html',1,'index']]]
+  ['allocation_20names_20and_20user_20data_435',['Allocation names and user data',['../allocation_annotation.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_1.html b/docs/html/search/pages_1.html
index 06f1e40..86c9cd3 100644
--- a/docs/html/search/pages_1.html
+++ b/docs/html/search/pages_1.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_1.js b/docs/html/search/pages_1.js
index e5f807d..308c385 100644
--- a/docs/html/search/pages_1.js
+++ b/docs/html/search/pages_1.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['choosing_20memory_20type',['Choosing memory type',['../choosing_memory_type.html',1,'index']]],
-  ['configuration',['Configuration',['../configuration.html',1,'index']]],
-  ['custom_20memory_20pools',['Custom memory pools',['../custom_memory_pools.html',1,'index']]]
+  ['choosing_20memory_20type_436',['Choosing memory type',['../choosing_memory_type.html',1,'']]],
+  ['configuration_437',['Configuration',['../configuration.html',1,'']]],
+  ['custom_20memory_20pools_438',['Custom memory pools',['../custom_memory_pools.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_2.html b/docs/html/search/pages_2.html
index 703f781..0c8adf5 100644
--- a/docs/html/search/pages_2.html
+++ b/docs/html/search/pages_2.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_2.js b/docs/html/search/pages_2.js
index f45f413..adb3333 100644
--- a/docs/html/search/pages_2.js
+++ b/docs/html/search/pages_2.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['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,'']]]
+  ['debugging_20incorrect_20memory_20usage_439',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'']]],
+  ['defragmentation_440',['Defragmentation',['../defragmentation.html',1,'']]],
+  ['deprecated_20list_441',['Deprecated List',['../deprecated.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_3.html b/docs/html/search/pages_3.html
index 299228a..7c591a2 100644
--- a/docs/html/search/pages_3.html
+++ b/docs/html/search/pages_3.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_3.js b/docs/html/search/pages_3.js
index 93e8ffe..65f1451 100644
--- a/docs/html/search/pages_3.js
+++ b/docs/html/search/pages_3.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['general_20considerations',['General considerations',['../general_considerations.html',1,'index']]]
+  ['general_20considerations_442',['General considerations',['../general_considerations.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_4.html b/docs/html/search/pages_4.html
index 021d277..63ed7c7 100644
--- a/docs/html/search/pages_4.html
+++ b/docs/html/search/pages_4.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_4.js b/docs/html/search/pages_4.js
index 2cd9042..3774a7d 100644
--- a/docs/html/search/pages_4.js
+++ b/docs/html/search/pages_4.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
+  ['lost_20allocations_443',['Lost allocations',['../lost_allocations.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_5.html b/docs/html/search/pages_5.html
index f57b343..5ef74eb 100644
--- a/docs/html/search/pages_5.html
+++ b/docs/html/search/pages_5.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_5.js b/docs/html/search/pages_5.js
index 125c1d3..79a2dce 100644
--- a/docs/html/search/pages_5.js
+++ b/docs/html/search/pages_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['memory_20mapping',['Memory mapping',['../memory_mapping.html',1,'index']]]
+  ['memory_20mapping_444',['Memory mapping',['../memory_mapping.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_6.html b/docs/html/search/pages_6.html
index 49cce0c..cd867a0 100644
--- a/docs/html/search/pages_6.html
+++ b/docs/html/search/pages_6.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_6.js b/docs/html/search/pages_6.js
index de761c9..24d9a4b 100644
--- a/docs/html/search/pages_6.js
+++ b/docs/html/search/pages_6.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
+  ['quick_20start_445',['Quick start',['../quick_start.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_7.html b/docs/html/search/pages_7.html
index 7867da6..2a0841f 100644
--- a/docs/html/search/pages_7.html
+++ b/docs/html/search/pages_7.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_7.js b/docs/html/search/pages_7.js
index 7394f7d..c17a725 100644
--- a/docs/html/search/pages_7.js
+++ b/docs/html/search/pages_7.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['record_20and_20replay',['Record and replay',['../record_and_replay.html',1,'index']]],
-  ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
+  ['record_20and_20replay_446',['Record and replay',['../record_and_replay.html',1,'']]],
+  ['recommended_20usage_20patterns_447',['Recommended usage patterns',['../usage_patterns.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_8.html b/docs/html/search/pages_8.html
index 333fc86..b30ace9 100644
--- a/docs/html/search/pages_8.html
+++ b/docs/html/search/pages_8.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_8.js b/docs/html/search/pages_8.js
index 566811f..680a628 100644
--- a/docs/html/search/pages_8.js
+++ b/docs/html/search/pages_8.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['statistics',['Statistics',['../statistics.html',1,'index']]]
+  ['statistics_448',['Statistics',['../statistics.html',1,'']]],
+  ['staying_20within_20budget_449',['Staying within budget',['../staying_within_budget.html',1,'']]]
 ];
diff --git a/docs/html/search/pages_9.html b/docs/html/search/pages_9.html
index b481f93..7cdd670 100644
--- a/docs/html/search/pages_9.html
+++ b/docs/html/search/pages_9.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_9.js b/docs/html/search/pages_9.js
index f9c7890..60a845e 100644
--- a/docs/html/search/pages_9.js
+++ b/docs/html/search/pages_9.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]]
+  ['vulkan_20memory_20allocator_450',['Vulkan Memory Allocator',['../index.html',1,'']]],
+  ['vk_5fkhr_5fdedicated_5fallocation_451',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'']]]
 ];
diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js
index 2257d01..832e1d2 100644
--- a/docs/html/search/searchdata.js
+++ b/docs/html/search/searchdata.js
@@ -1,10 +1,10 @@
 var indexSectionsWithContent =
 {
-  0: "abcdfglmnopqrstuv",
+  0: "abcdfgilmnopqrstuv",
   1: "v",
   2: "v",
   3: "v",
-  4: "abcdfmoprstuv",
+  4: "abcdfimoprstuv",
   5: "pv",
   6: "v",
   7: "v",
diff --git a/docs/html/search/typedefs_0.html b/docs/html/search/typedefs_0.html
index 3848b20..8f30b85 100644
--- a/docs/html/search/typedefs_0.html
+++ b/docs/html/search/typedefs_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="typedefs_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/typedefs_0.js b/docs/html/search/typedefs_0.js
index b2e0e2c..c5622f9 100644
--- a/docs/html/search/typedefs_0.js
+++ b/docs/html/search/typedefs_0.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['pfn_5fvmaallocatedevicememoryfunction',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
-  ['pfn_5fvmafreedevicememoryfunction',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]]
+  ['pfn_5fvmaallocatedevicememoryfunction_358',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
+  ['pfn_5fvmafreedevicememoryfunction_359',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/typedefs_1.html b/docs/html/search/typedefs_1.html
index c8a0268..0cfdad7 100644
--- a/docs/html/search/typedefs_1.html
+++ b/docs/html/search/typedefs_1.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="typedefs_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js
index 24b8c6a..25020fe 100644
--- a/docs/html/search/typedefs_1.js
+++ b/docs/html/search/typedefs_1.js
@@ -1,27 +1,28 @@
 var searchData=
 [
-  ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'vk_mem_alloc.h']]],
-  ['vmaallocationinfo',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'vk_mem_alloc.h']]],
-  ['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']]],
-  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'vk_mem_alloc.h']]],
-  ['vmapoolstats',['VmaPoolStats',['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'vk_mem_alloc.h']]],
-  ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'vk_mem_alloc.h']]],
-  ['vmarecordflags',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
-  ['vmarecordsettings',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'vk_mem_alloc.h']]],
-  ['vmastatinfo',['VmaStatInfo',['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'vk_mem_alloc.h']]],
-  ['vmastats',['VmaStats',['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'vk_mem_alloc.h']]],
-  ['vmavulkanfunctions',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'vk_mem_alloc.h']]]
+  ['vmaallocationcreateflagbits_360',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateflags_361',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateinfo_362',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'vk_mem_alloc.h']]],
+  ['vmaallocationinfo_363',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflagbits_364',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflags_365',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateinfo_366',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'vk_mem_alloc.h']]],
+  ['vmabudget_367',['VmaBudget',['../vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_368',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflags_369',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo_370',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo2_371',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationstats_372',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9',1,'vk_mem_alloc.h']]],
+  ['vmadevicememorycallbacks_373',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_374',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflagbits_375',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflags_376',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateinfo_377',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'vk_mem_alloc.h']]],
+  ['vmapoolstats_378',['VmaPoolStats',['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits_379',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'vk_mem_alloc.h']]],
+  ['vmarecordflags_380',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings_381',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'vk_mem_alloc.h']]],
+  ['vmastatinfo_382',['VmaStatInfo',['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'vk_mem_alloc.h']]],
+  ['vmastats_383',['VmaStats',['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'vk_mem_alloc.h']]],
+  ['vmavulkanfunctions_384',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html
index 12104bc..a2a3ae6 100644
--- a/docs/html/search/variables_0.html
+++ b/docs/html/search/variables_0.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js
index 84b63ea..986f388 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()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',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']]],
-  ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
+  ['allocationbytes_280',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]],
+  ['allocationcount_281',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]],
+  ['allocationsizeavg_282',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
+  ['allocationsizemax_283',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
+  ['allocationsizemin_284',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
+  ['allocationsmoved_285',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html
index b784017..b243c42 100644
--- a/docs/html/search/variables_1.html
+++ b/docs/html/search/variables_1.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js
index 7ae997e..f944ee1 100644
--- a/docs/html/search/variables_1.js
+++ b/docs/html/search/variables_1.js
@@ -1,7 +1,9 @@
 var searchData=
 [
-  ['blockcount',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
-  ['blocksize',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
-  ['bytesfreed',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
-  ['bytesmoved',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
+  ['blockbytes_286',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]],
+  ['blockcount_287',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
+  ['blocksize_288',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
+  ['budget_289',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]],
+  ['bytesfreed_290',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
+  ['bytesmoved_291',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html
index 0cb98d3..647df20 100644
--- a/docs/html/search/variables_2.html
+++ b/docs/html/search/variables_2.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js
index 14f4473..11fd7fd 100644
--- a/docs/html/search/variables_2.js
+++ b/docs/html/search/variables_2.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['commandbuffer',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]]
+  ['commandbuffer_292',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]]
 ];
diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html
index 1e83bf5..9dc9b89 100644
--- a/docs/html/search/variables_3.html
+++ b/docs/html/search/variables_3.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js
index ae5f1ff..ff118b4 100644
--- a/docs/html/search/variables_3.js
+++ b/docs/html/search/variables_3.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['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']]]
+  ['device_293',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo']]],
+  ['devicememory_294',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]],
+  ['devicememoryblocksfreed_295',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html
index 39883bd..78cc2c7 100644
--- a/docs/html/search/variables_4.html
+++ b/docs/html/search/variables_4.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js
index 09f7db0..777d252 100644
--- a/docs/html/search/variables_4.js
+++ b/docs/html/search/variables_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()'],['../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()']]]
+  ['flags_296',['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_297',['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_5.html b/docs/html/search/variables_5.html
index f25879c..dfa3558 100644
--- a/docs/html/search/variables_5.html
+++ b/docs/html/search/variables_5.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js
index 2bbb589..19a1666 100644
--- a/docs/html/search/variables_5.js
+++ b/docs/html/search/variables_5.js
@@ -1,15 +1,4 @@
 var searchData=
 [
-  ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
-  ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
-  ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
-  ['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']]],
-  ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
-  ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]]
+  ['instance_298',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/docs/html/search/variables_6.html b/docs/html/search/variables_6.html
index 0fcd6c2..cd462bd 100644
--- a/docs/html/search/variables_6.html
+++ b/docs/html/search/variables_6.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js
index c9c4229..8f3ba41 100644
--- a/docs/html/search/variables_6.js
+++ b/docs/html/search/variables_6.js
@@ -1,4 +1,15 @@
 var searchData=
 [
-  ['offset',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
+  ['maxallocationstomove_299',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
+  ['maxblockcount_300',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
+  ['maxbytestomove_301',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
+  ['maxcpuallocationstomove_302',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
+  ['maxcpubytestomove_303',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
+  ['maxgpuallocationstomove_304',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
+  ['maxgpubytestomove_305',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
+  ['memoryheap_306',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]],
+  ['memorytype_307',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]],
+  ['memorytypebits_308',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]],
+  ['memorytypeindex_309',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
+  ['minblockcount_310',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]]
 ];
diff --git a/docs/html/search/variables_7.html b/docs/html/search/variables_7.html
index ad2fa37..47994b8 100644
--- a/docs/html/search/variables_7.html
+++ b/docs/html/search/variables_7.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js
index 1c112c0..ff9a3bb 100644
--- a/docs/html/search/variables_7.js
+++ b/docs/html/search/variables_7.js
@@ -1,21 +1,4 @@
 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']]],
-  ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
-  ['pheapsizelimit',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
-  ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
-  ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
-  ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
-  ['poolcount',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
-  ['ppools',['pPools',['../struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1',1,'VmaDefragmentationInfo2']]],
-  ['precordsettings',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
-  ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
-  ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
-  ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
-  ['pvulkanfunctions',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
+  ['offset_311',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
 ];
diff --git a/docs/html/search/variables_8.html b/docs/html/search/variables_8.html
index 23887d7..a50ee8f 100644
--- a/docs/html/search/variables_8.html
+++ b/docs/html/search/variables_8.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js
index 9505699..dff0212 100644
--- a/docs/html/search/variables_8.js
+++ b/docs/html/search/variables_8.js
@@ -1,4 +1,21 @@
 var searchData=
 [
-  ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]]
+  ['pallocationcallbacks_312',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations_313',['pAllocations',['../struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged_314',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
+  ['pdevicememorycallbacks_315',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath_316',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
+  ['pfnallocate_317',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
+  ['pfnfree_318',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
+  ['pheapsizelimit_319',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
+  ['physicaldevice_320',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
+  ['pmappeddata_321',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
+  ['pool_322',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['poolcount_323',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
+  ['ppools_324',['pPools',['../struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1',1,'VmaDefragmentationInfo2']]],
+  ['precordsettings_325',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
+  ['preferredflags_326',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
+  ['preferredlargeheapblocksize_327',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
+  ['puserdata_328',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
+  ['pvulkanfunctions_329',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/docs/html/search/variables_9.html b/docs/html/search/variables_9.html
index f446649..82db8ae 100644
--- a/docs/html/search/variables_9.html
+++ b/docs/html/search/variables_9.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_9.js b/docs/html/search/variables_9.js
index 740c955..d5dd409 100644
--- a/docs/html/search/variables_9.js
+++ b/docs/html/search/variables_9.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]]
+  ['requiredflags_330',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]]
 ];
diff --git a/docs/html/search/variables_a.html b/docs/html/search/variables_a.html
index 59633b3..fd8f0d7 100644
--- a/docs/html/search/variables_a.html
+++ b/docs/html/search/variables_a.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_a.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js
index f8fbe3d..f922772 100644
--- a/docs/html/search/variables_a.js
+++ b/docs/html/search/variables_a.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['total',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
+  ['size_331',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]]
 ];
diff --git a/docs/html/search/variables_b.html b/docs/html/search/variables_b.html
index 1721609..577a4b7 100644
--- a/docs/html/search/variables_b.html
+++ b/docs/html/search/variables_b.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_b.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js
index bb52d7a..5792243 100644
--- a/docs/html/search/variables_b.js
+++ b/docs/html/search/variables_b.js
@@ -1,11 +1,4 @@
 var searchData=
 [
-  ['unusedbytes',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
-  ['unusedrangecount',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
-  ['unusedrangesizeavg',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
-  ['unusedrangesizemax',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
-  ['unusedrangesizemin',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
-  ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
-  ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]],
-  ['usedbytes',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
+  ['total_332',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
 ];
diff --git a/docs/html/search/variables_c.html b/docs/html/search/variables_c.html
index 78e211a..0b92edb 100644
--- a/docs/html/search/variables_c.html
+++ b/docs/html/search/variables_c.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html><head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_c.js"></script>
 <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js
index e7b9e7f..d34d538 100644
--- a/docs/html/search/variables_c.js
+++ b/docs/html/search/variables_c.js
@@ -1,20 +1,11 @@
 var searchData=
 [
-  ['vkallocatememory',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
-  ['vkbindbuffermemory',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
-  ['vkbindimagememory',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
-  ['vkcmdcopybuffer',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
-  ['vkcreatebuffer',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
-  ['vkcreateimage',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
-  ['vkdestroybuffer',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
-  ['vkdestroyimage',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
-  ['vkflushmappedmemoryranges',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
-  ['vkfreememory',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldevicememoryproperties',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldeviceproperties',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
-  ['vkinvalidatemappedmemoryranges',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
-  ['vkmapmemory',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
-  ['vkunmapmemory',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]]
+  ['unusedbytes_333',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
+  ['unusedrangecount_334',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
+  ['unusedrangesizeavg_335',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
+  ['unusedrangesizemax_336',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
+  ['unusedrangesizemin_337',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
+  ['unusedsize_338',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
+  ['usage_339',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
+  ['usedbytes_340',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
 ];
diff --git a/docs/html/search/variables_d.html b/docs/html/search/variables_d.html
new file mode 100644
index 0000000..8b53e60
--- /dev/null
+++ b/docs/html/search/variables_d.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+createResults();
+/* @license-end */
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+/* @license-end */
+--></script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js
new file mode 100644
index 0000000..bdc31b8
--- /dev/null
+++ b/docs/html/search/variables_d.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+  ['vkallocatememory_341',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
+  ['vkbindbuffermemory_342',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
+  ['vkbindimagememory_343',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
+  ['vkcmdcopybuffer_344',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
+  ['vkcreatebuffer_345',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
+  ['vkcreateimage_346',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
+  ['vkdestroybuffer_347',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
+  ['vkdestroyimage_348',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
+  ['vkflushmappedmemoryranges_349',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
+  ['vkfreememory_350',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements_351',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements_352',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldevicememoryproperties_353',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldeviceproperties_354',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
+  ['vkinvalidatemappedmemoryranges_355',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
+  ['vkmapmemory_356',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
+  ['vkunmapmemory_357',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]]
+];
diff --git a/docs/html/statistics.html b/docs/html/statistics.html
index 2e0bd10..751f5ab 100644
--- a/docs/html/statistics.html
+++ b/docs/html/statistics.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Statistics</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -72,21 +68,21 @@
 <div class="textblock"><p>This library contains functions that return information about its internal state, especially the amount of memory allocated from Vulkan. Please keep in mind that these functions need to traverse all internal data structures to gather these information, so they may be quite time-consuming. Don't call them too often.</p>
 <h1><a class="anchor" id="statistics_numeric_statistics"></a>
 Numeric statistics</h1>
-<p>You can query for overall statistics of the allocator using function <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>. Information are returned using structure <a class="el" href="struct_vma_stats.html" title="General statistics from current state of Allocator.">VmaStats</a>. It contains <a class="el" href="struct_vma_stat_info.html" title="Calculated statistics of memory usage in entire allocator.">VmaStatInfo</a> - number of allocated blocks, number of allocations (occupied ranges in these blocks), number of unused (free) ranges in these blocks, number of bytes used and unused (but still allocated from Vulkan) and other information. They are summed across memory heaps, memory types and total for whole allocator.</p>
-<p>You can query for statistics of a custom pool using function <a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153" title="Retrieves statistics of existing VmaPool object.">vmaGetPoolStats()</a>. Information are returned using structure <a class="el" href="struct_vma_pool_stats.html" title="Describes parameter of existing VmaPool.">VmaPoolStats</a>.</p>
-<p>You can query for information about specific allocation using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. It fill structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p>
+<p>You can query for overall statistics of the allocator using function <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>. Information are returned using structure <a class="el" href="struct_vma_stats.html" title="General statistics from current state of Allocator.">VmaStats</a>. It contains <a class="el" href="struct_vma_stat_info.html" title="Calculated statistics of memory usage in entire allocator.">VmaStatInfo</a> - number of allocated blocks, number of allocations (occupied ranges in these blocks), number of unused (free) ranges in these blocks, number of bytes used and unused (but still allocated from Vulkan) and other information. They are summed across memory heaps, memory types and total for whole allocator.</p>
+<p>You can query for statistics of a custom pool using function <a class="el" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf" title="Retrieves statistics of existing VmaPool object.">vmaGetPoolStats()</a>. Information are returned using structure <a class="el" href="struct_vma_pool_stats.html" title="Describes parameter of existing VmaPool.">VmaPoolStats</a>.</p>
+<p>You can query for information about specific allocation using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. It fill structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p>
 <h1><a class="anchor" id="statistics_json_dump"></a>
 JSON dump</h1>
-<p>You can dump internal state of the allocator to a string in JSON format using function <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. The result is guaranteed to be correct JSON. It uses ANSI encoding. Any strings provided by user (see <a class="el" href="allocation_annotation.html#allocation_names">Allocation names</a>) are copied as-is and properly escaped for JSON, so if they use UTF-8, ISO-8859-2 or any other encoding, this JSON string can be treated as using this encoding. It must be freed using function <a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString()</a>.</p>
+<p>You can dump internal state of the allocator to a string in JSON format using function <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. The result is guaranteed to be correct JSON. It uses ANSI encoding. Any strings provided by user (see <a class="el" href="allocation_annotation.html#allocation_names">Allocation names</a>) are copied as-is and properly escaped for JSON, so if they use UTF-8, ISO-8859-2 or any other encoding, this JSON string can be treated as using this encoding. It must be freed using function <a class="el" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString()</a>.</p>
 <p>The format of this JSON string is not part of official documentation of the library, but it will not change in backward-incompatible way without increasing library major version number and appropriate mention in changelog.</p>
-<p>The JSON string contains all the data that can be obtained using <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>. It can also contain detailed map of allocated memory blocks and their regions - free and occupied by allocations. This allows e.g. to visualize the memory or assess fragmentation. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+<p>The JSON string contains all the data that can be obtained using <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>. It can also contain detailed map of allocated memory blocks and their regions - free and occupied by allocations. This allows e.g. to visualize the memory or assess fragmentation. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/staying_within_budget.html b/docs/html/staying_within_budget.html
new file mode 100644
index 0000000..97a0964
--- /dev/null
+++ b/docs/html/staying_within_budget.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.16"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Staying within budget</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.16 -->
+<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="PageDoc"><div class="header">
+  <div class="headertitle">
+<div class="title">Staying within budget </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>When developing a graphics-intensive game or program, it is important to avoid allocating more GPU memory than it's physically available. When the memory is over-committed, various bad things can happen, depending on the specific GPU, graphics driver, and operating system:</p>
+<ul>
+<li>It may just work without any problems.</li>
+<li>The application may slow down because some memory blocks are moved to system RAM and the GPU has to access them through PCI Express bus.</li>
+<li>A new allocation may take very long time to complete, even few seconds, and possibly freeze entire system.</li>
+<li>The new allocation may fail with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>.</li>
+<li>It may even result in GPU crash (TDR), observed as <code>VK_ERROR_DEVICE_LOST</code> returned somewhere later.</li>
+</ul>
+<h1><a class="anchor" id="staying_within_budget_querying_for_budget"></a>
+Querying for budget</h1>
+<p>To query for current memory usage and available budget, use function <a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0" title="Retrieves information about current memory budget for all memory heaps.">vmaGetBudget()</a>. Returned structure <a class="el" href="struct_vma_budget.html" title="Statistics of current memory usage and available budget, in bytes, for specific memory heap.">VmaBudget</a> contains quantities expressed in bytes, per Vulkan memory heap.</p>
+<p>Please note that this function returns different information and works faster than <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>. <a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0" title="Retrieves information about current memory budget for all memory heaps.">vmaGetBudget()</a> can be called every frame or even before every allocation, while <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a> is intended to be used rarely, only to obtain statistical information, e.g. for debugging purposes.</p>
+<p>It is recommended to use <b>VK_EXT_memory_budget</b> device extension to obtain information about the budget from Vulkan device. VMA is able to use this extension automatically. When not enabled, the allocator behaves same way, but then it estimates current usage and available budget based on its internal information and Vulkan memory heap sizes, which may be less precise. In order to use this extension:</p>
+<ol type="1">
+<li>Make sure extensions VK_EXT_memory_budget and VK_KHR_get_physical_device_properties2 required by it are available and enable them. Please note that the first is a device extension and the second is instance extension!</li>
+<li>Use flag <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> when creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object.</li>
+<li>Make sure to call <a class="el" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67" title="Sets index of the current frame.">vmaSetCurrentFrameIndex()</a> every frame. Budget is queried from Vulkan inside of it to avoid overhead of querying it with every allocation.</li>
+</ol>
+<h1><a class="anchor" id="staying_within_budget_controlling_memory_usage"></a>
+Controlling memory usage</h1>
+<p>There are many ways in which you can try to stay within the budget.</p>
+<p>First, when making new allocation requires allocating a new memory block, the library tries not to exceed the budget automatically. If a block with default recommended size (e.g. 256 MB) would go over budget, a smaller block is allocated, possibly even dedicated memory for just this resource.</p>
+<p>If the size of the requested resource plus current memory usage is more than the budget, by default the library still tries to create it, leaving it to the Vulkan implementation whether the allocation succeeds or fails. You can change this behavior by using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> flag. With it, the allocation is not made if it would exceed the budget or if the budget is already exceeded. Some other allocations become lost instead to make room for it, if the mechanism of <a class="el" href="lost_allocations.html">lost allocations</a> is used. If that is not possible, the allocation fails with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>. Example usage pattern may be to pass the <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> flag when creating resources that are not essential for the application (e.g. the texture of a specific object) and not to pass it when creating critically important resources (e.g. render targets).</p>
+<p>Finally, you can also use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff" title="Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> flag to make sure a new allocation is created only when it fits inside one of the existing memory blocks. If it would require to allocate a new block, if fails instead with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>. This also ensures that the function call is very fast because it never goes to Vulkan to obtain a new block.</p>
+<p>Please note that creating <a class="el" href="custom_memory_pools.html">Custom memory pools</a> with <a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae" title="Minimum number of blocks to be always allocated in this pool, even if they stay empty.">VmaPoolCreateInfo::minBlockCount</a> set to more than 0 will try to allocate memory blocks without checking whether they fit within budget. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<!-- 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.16
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_allocation.html b/docs/html/struct_vma_allocation.html
index d097e15..77dc9ad 100644
--- a/docs/html/struct_vma_allocation.html
+++ b/docs/html/struct_vma_allocation.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocation Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -75,7 +75,7 @@
 <p>It may be either dedicated block of <code>VkDeviceMemory</code> or a specific region of a bigger block of this type plus unique offset.</p>
 <p>There are multiple ways to create such object. You need to fill structure <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>. For more information see <a class="el" href="choosing_memory_type.html">Choosing memory type</a>.</p>
 <p>Although the library provides convenience functions that create Vulkan buffer or image, allocate memory for it and bind them together, binding of the allocation to a buffer or an image is out of scope of the allocation itself. Allocation object can exist without buffer/image bound, binding can be done manually by the user, and destruction of it can be done independently of destruction of the allocation.</p>
-<p>The object also remembers its size and some other information. To retrieve this information, use function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and inspect returned structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p>
+<p>The object also remembers its size and some other information. To retrieve this information, use function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and inspect returned structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p>
 <p>Some kinds allocations can be in lost state. For more information, see <a class="el" href="lost_allocations.html">Lost allocations</a>. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
 <li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
@@ -85,7 +85,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocation_create_info-members.html b/docs/html/struct_vma_allocation_create_info-members.html
index c06a2bb..8d62d8b 100644
--- a/docs/html/struct_vma_allocation_create_info-members.html
+++ b/docs/html/struct_vma_allocation_create_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -80,7 +80,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocation_create_info.html b/docs/html/struct_vma_allocation_create_info.html
index d4fb3a1..41de63c 100644
--- a/docs/html/struct_vma_allocation_create_info.html
+++ b/docs/html/struct_vma_allocation_create_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocationCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -74,25 +74,25 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:add09658ac14fe290ace25470ddd6d41b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a></td></tr>
-<tr class="memdesc:add09658ac14fe290ace25470ddd6d41b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Use <a class="el" href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4" title="Flags to be passed as VmaAllocationCreateInfo::flags.">VmaAllocationCreateFlagBits</a> enum.  <a href="#add09658ac14fe290ace25470ddd6d41b">More...</a><br /></td></tr>
+<tr class="memdesc:add09658ac14fe290ace25470ddd6d41b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Use <a class="el" href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4" title="Flags to be passed as VmaAllocationCreateInfo::flags.">VmaAllocationCreateFlagBits</a> enum.  <a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">More...</a><br /></td></tr>
 <tr class="separator:add09658ac14fe290ace25470ddd6d41b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:accb8b06b1f677d858cb9af20705fa910"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a></td></tr>
-<tr class="memdesc:accb8b06b1f677d858cb9af20705fa910"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intended usage of memory.  <a href="#accb8b06b1f677d858cb9af20705fa910">More...</a><br /></td></tr>
+<tr class="memdesc:accb8b06b1f677d858cb9af20705fa910"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intended usage of memory.  <a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">More...</a><br /></td></tr>
 <tr class="separator:accb8b06b1f677d858cb9af20705fa910"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9166390303ff42d783305bc31c2b6b90"><td class="memItemLeft" align="right" valign="top">VkMemoryPropertyFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a></td></tr>
-<tr class="memdesc:a9166390303ff42d783305bc31c2b6b90"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that must be set in a Memory Type chosen for an allocation.  <a href="#a9166390303ff42d783305bc31c2b6b90">More...</a><br /></td></tr>
+<tr class="memdesc:a9166390303ff42d783305bc31c2b6b90"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that must be set in a Memory Type chosen for an allocation.  <a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">More...</a><br /></td></tr>
 <tr class="separator:a9166390303ff42d783305bc31c2b6b90"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a7fe8d81a1ad10b2a2faacacee5b15d6d"><td class="memItemLeft" align="right" valign="top">VkMemoryPropertyFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a></td></tr>
-<tr class="memdesc:a7fe8d81a1ad10b2a2faacacee5b15d6d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that preferably should be set in a memory type chosen for an allocation.  <a href="#a7fe8d81a1ad10b2a2faacacee5b15d6d">More...</a><br /></td></tr>
+<tr class="memdesc:a7fe8d81a1ad10b2a2faacacee5b15d6d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that preferably should be set in a memory type chosen for an allocation.  <a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">More...</a><br /></td></tr>
 <tr class="separator:a7fe8d81a1ad10b2a2faacacee5b15d6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3bf940c0271d85d6ba32a4d820075055"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a></td></tr>
-<tr class="memdesc:a3bf940c0271d85d6ba32a4d820075055"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bitmask containing one bit set for every memory type acceptable for this allocation.  <a href="#a3bf940c0271d85d6ba32a4d820075055">More...</a><br /></td></tr>
+<tr class="memdesc:a3bf940c0271d85d6ba32a4d820075055"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bitmask containing one bit set for every memory type acceptable for this allocation.  <a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">More...</a><br /></td></tr>
 <tr class="separator:a3bf940c0271d85d6ba32a4d820075055"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6272c0555cfd1fe28bff1afeb6190150"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a></td></tr>
-<tr class="memdesc:a6272c0555cfd1fe28bff1afeb6190150"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pool that this allocation should be created in.  <a href="#a6272c0555cfd1fe28bff1afeb6190150">More...</a><br /></td></tr>
+<tr class="memdesc:a6272c0555cfd1fe28bff1afeb6190150"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pool that this allocation should be created in.  <a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">More...</a><br /></td></tr>
 <tr class="separator:a6272c0555cfd1fe28bff1afeb6190150"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8259e85c272683434f4abb4ddddffe19"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td></tr>
-<tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr>
+<tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr>
 <tr class="separator:a8259e85c272683434f4abb4ddddffe19"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Member Data Documentation</h2>
@@ -125,7 +125,7 @@
 </div><div class="memdoc">
 
 <p>Bitmask containing one bit set for every memory type acceptable for this allocation. </p>
-<p>Value 0 is equivalent to <code>UINT32_MAX</code> - it means any memory type is accepted if it meets other requirements specified by this structure, with no further restrictions on memory type index. <br />
+<p>Value 0 is equivalent to <code>UINT32_MAX</code> - it means any memory type is accepted if it meets other requirements specified by this structure, with no further restrictions on memory type index. <br  />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
@@ -160,7 +160,7 @@
 </div><div class="memdoc">
 
 <p>Flags that preferably should be set in a memory type chosen for an allocation. </p>
-<p>Set to 0 if no additional flags are prefered. <br />
+<p>Set to 0 if no additional flags are prefered. <br  />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
@@ -177,7 +177,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. </p>
+<p>Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. </p>
 <p>If <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> is used, it must be either null or pointer to a null-terminated string. The string will be then copied to internal buffer, so it doesn't need to be valid after allocation call. </p>
 
 </div>
@@ -195,7 +195,7 @@
 </div><div class="memdoc">
 
 <p>Flags that must be set in a Memory Type chosen for an allocation. </p>
-<p>Leave 0 if you specify memory requirements in other way. <br />
+<p>Leave 0 if you specify memory requirements in other way. <br  />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
@@ -213,7 +213,7 @@
 </div><div class="memdoc">
 
 <p>Intended usage of memory. </p>
-<p>You can leave <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> if you specify memory requirements in other way. <br />
+<p>You can leave <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> if you specify memory requirements in other way. <br  />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
@@ -226,7 +226,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocation_info-members.html b/docs/html/struct_vma_allocation_info-members.html
index 86000bf..87275ce 100644
--- a/docs/html/struct_vma_allocation_info-members.html
+++ b/docs/html/struct_vma_allocation_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -79,7 +79,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocation_info.html b/docs/html/struct_vma_allocation_info.html
index 6df5c20..1c540d1 100644
--- a/docs/html/struct_vma_allocation_info.html
+++ b/docs/html/struct_vma_allocation_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocationInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -69,7 +69,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  
+<p>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#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  
  <a href="struct_vma_allocation_info.html#details">More...</a></p>
 
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
@@ -77,26 +77,26 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a7f6b0aa58c135e488e6b40a388dad9d5"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a></td></tr>
-<tr class="memdesc:a7f6b0aa58c135e488e6b40a388dad9d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory type index that this allocation was allocated from.  <a href="#a7f6b0aa58c135e488e6b40a388dad9d5">More...</a><br /></td></tr>
+<tr class="memdesc:a7f6b0aa58c135e488e6b40a388dad9d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory type index that this allocation was allocated from.  <a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">More...</a><br /></td></tr>
 <tr class="separator:a7f6b0aa58c135e488e6b40a388dad9d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="memItemLeft" align="right" valign="top">VkDeviceMemory&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a></td></tr>
-<tr class="memdesc:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle to Vulkan memory object.  <a href="#ae0bfb7dfdf79a76ffefc9a94677a2f67">More...</a><br /></td></tr>
+<tr class="memdesc:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle to Vulkan memory object.  <a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">More...</a><br /></td></tr>
 <tr class="separator:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4a3c732388dbdc7a23f9365b00825268"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a></td></tr>
-<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft">&#160;</td><td class="mdescRight">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation.  <a href="#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr>
+<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft">&#160;</td><td class="mdescRight">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation.  <a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr>
 <tr class="separator:a4a3c732388dbdc7a23f9365b00825268"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a></td></tr>
-<tr class="memdesc:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of this allocation, in bytes.  <a href="#aac76d113a6a5ccbb09fea00fb25fd18f">More...</a><br /></td></tr>
+<tr class="memdesc:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of this allocation, in bytes.  <a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">More...</a><br /></td></tr>
 <tr class="separator:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5eeffbe2d2f30f53370ff14aefbadbe2"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a></td></tr>
-<tr class="memdesc:a5eeffbe2d2f30f53370ff14aefbadbe2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the beginning of this allocation as mapped data.  <a href="#a5eeffbe2d2f30f53370ff14aefbadbe2">More...</a><br /></td></tr>
+<tr class="memdesc:a5eeffbe2d2f30f53370ff14aefbadbe2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the beginning of this allocation as mapped data.  <a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">More...</a><br /></td></tr>
 <tr class="separator:a5eeffbe2d2f30f53370ff14aefbadbe2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:adc507656149c04de7ed95d0042ba2a13"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a></td></tr>
-<tr class="memdesc:adc507656149c04de7ed95d0042ba2a13"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that was passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or set using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="#adc507656149c04de7ed95d0042ba2a13">More...</a><br /></td></tr>
+<tr class="memdesc:adc507656149c04de7ed95d0042ba2a13"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that was passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or set using <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">More...</a><br /></td></tr>
 <tr class="separator:adc507656149c04de7ed95d0042ba2a13"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
+<div class="textblock"><p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="ae0bfb7dfdf79a76ffefc9a94677a2f67"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae0bfb7dfdf79a76ffefc9a94677a2f67">&#9670;&nbsp;</a></span>deviceMemory</h2>
@@ -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="Deprecated. 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#a2c33b164a2597db181db3ca8e5812e4c" 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="Deprecated. 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#a2c33b164a2597db181db3ca8e5812e4c" 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>
@@ -164,8 +164,8 @@
 </div><div class="memdoc">
 
 <p>Pointer to the beginning of this allocation as mapped data. </p>
-<p>If the allocation hasn't been mapped using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a> and hasn't been created with <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="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a> if this allocation is passed to the function. </p>
+<p>If the allocation hasn't been mapped using <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" 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#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" 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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a> if this allocation is passed to the function. </p>
 
 </div>
 </div>
@@ -181,8 +181,8 @@
       </table>
 </div><div class="memdoc">
 
-<p>Custom general-purpose pointer that was passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or set using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. </p>
-<p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a> for this allocation. </p>
+<p>Custom general-purpose pointer that was passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or set using <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. </p>
+<p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a> for this allocation. </p>
 
 </div>
 </div>
@@ -211,7 +211,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocator.html b/docs/html/struct_vma_allocator.html
index 2a93799..97ce081 100644
--- a/docs/html/struct_vma_allocator.html
+++ b/docs/html/struct_vma_allocator.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocator Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -72,7 +72,7 @@
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Represents main object of this library initialized. </p>
-<p>Fill structure <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d" title="Destroys allocator object.">vmaDestroyAllocator()</a> to destroy it.</p>
+<p>Fill structure <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d" title="Creates Allocator object.">vmaCreateAllocator()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5" title="Destroys allocator object.">vmaDestroyAllocator()</a> to destroy it.</p>
 <p>It is recommended to create just one object of this type per <code>VkDevice</code> object, right after Vulkan is initialized and keep it alive until before Vulkan device is destroyed. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
 <li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
@@ -82,7 +82,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocator_create_info-members.html b/docs/html/struct_vma_allocator_create_info-members.html
index df9173a..ea055d3 100644
--- a/docs/html/struct_vma_allocator_create_info-members.html
+++ b/docs/html/struct_vma_allocator_create_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -71,19 +71,20 @@
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_allocator_create_info.html b/docs/html/struct_vma_allocator_create_info.html
index 5f53200..611b3a7 100644
--- a/docs/html/struct_vma_allocator_create_info.html
+++ b/docs/html/struct_vma_allocator_create_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocatorCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,35 +77,38 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a392ea2ecbaff93f91a7c49f735ad4346"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a></td></tr>
-<tr class="memdesc:a392ea2ecbaff93f91a7c49f735ad4346"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created allocator. Use <a class="el" href="vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915" title="Flags for created VmaAllocator.">VmaAllocatorCreateFlagBits</a> enum.  <a href="#a392ea2ecbaff93f91a7c49f735ad4346">More...</a><br /></td></tr>
+<tr class="memdesc:a392ea2ecbaff93f91a7c49f735ad4346"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created allocator. Use <a class="el" href="vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915" title="Flags for created VmaAllocator.">VmaAllocatorCreateFlagBits</a> enum.  <a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">More...</a><br /></td></tr>
 <tr class="separator:a392ea2ecbaff93f91a7c49f735ad4346"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a08230f04ae6ccf8a78150a9e829a7156"><td class="memItemLeft" align="right" valign="top">VkPhysicalDevice&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a></td></tr>
-<tr class="memdesc:a08230f04ae6ccf8a78150a9e829a7156"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan physical device.  <a href="#a08230f04ae6ccf8a78150a9e829a7156">More...</a><br /></td></tr>
+<tr class="memdesc:a08230f04ae6ccf8a78150a9e829a7156"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan physical device.  <a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">More...</a><br /></td></tr>
 <tr class="separator:a08230f04ae6ccf8a78150a9e829a7156"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad924ddd77b04039c88d0c09b0ffcd500"><td class="memItemLeft" align="right" valign="top">VkDevice&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a></td></tr>
-<tr class="memdesc:ad924ddd77b04039c88d0c09b0ffcd500"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan device.  <a href="#ad924ddd77b04039c88d0c09b0ffcd500">More...</a><br /></td></tr>
+<tr class="memdesc:ad924ddd77b04039c88d0c09b0ffcd500"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan device.  <a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">More...</a><br /></td></tr>
 <tr class="separator:ad924ddd77b04039c88d0c09b0ffcd500"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8e4714298e3121cdd8b214a1ae7a637a"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td></tr>
-<tr class="memdesc:a8e4714298e3121cdd8b214a1ae7a637a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB. Optional.  <a href="#a8e4714298e3121cdd8b214a1ae7a637a">More...</a><br /></td></tr>
+<tr class="memdesc:a8e4714298e3121cdd8b214a1ae7a637a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB. Optional.  <a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">More...</a><br /></td></tr>
 <tr class="separator:a8e4714298e3121cdd8b214a1ae7a637a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6e409087e3be55400d0e4ccbe43c608d"><td class="memItemLeft" align="right" valign="top">const VkAllocationCallbacks *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a></td></tr>
-<tr class="memdesc:a6e409087e3be55400d0e4ccbe43c608d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom CPU memory allocation callbacks. Optional.  <a href="#a6e409087e3be55400d0e4ccbe43c608d">More...</a><br /></td></tr>
+<tr class="memdesc:a6e409087e3be55400d0e4ccbe43c608d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom CPU memory allocation callbacks. Optional.  <a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">More...</a><br /></td></tr>
 <tr class="separator:a6e409087e3be55400d0e4ccbe43c608d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af1380969b5e1ea4c3184a877892d260e"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a></td></tr>
-<tr class="memdesc:af1380969b5e1ea4c3184a877892d260e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informative callbacks for <code>vkAllocateMemory</code>, <code>vkFreeMemory</code>. Optional.  <a href="#af1380969b5e1ea4c3184a877892d260e">More...</a><br /></td></tr>
+<tr class="memdesc:af1380969b5e1ea4c3184a877892d260e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informative callbacks for <code>vkAllocateMemory</code>, <code>vkFreeMemory</code>. Optional.  <a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">More...</a><br /></td></tr>
 <tr class="separator:af1380969b5e1ea4c3184a877892d260e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a></td></tr>
-<tr class="memdesc:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="#a21ea188dd212b8171cb9ecbed4a2a3a7">More...</a><br /></td></tr>
+<tr class="memdesc:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">More...</a><br /></td></tr>
 <tr class="separator:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="memItemLeft" align="right" valign="top">const VkDeviceSize *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a></td></tr>
-<tr class="memdesc:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.  <a href="#a31c192aa6cbffa33279f6d9f0c47c44b">More...</a><br /></td></tr>
+<tr class="memdesc:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.  <a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">More...</a><br /></td></tr>
 <tr class="separator:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3dc197be3227da7338b1643f70db36bd"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td></tr>
-<tr class="memdesc:a3dc197be3227da7338b1643f70db36bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to Vulkan functions. Can be null if you leave define <code>VMA_STATIC_VULKAN_FUNCTIONS 1</code>.  <a href="#a3dc197be3227da7338b1643f70db36bd">More...</a><br /></td></tr>
+<tr class="memdesc:a3dc197be3227da7338b1643f70db36bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to Vulkan functions. Can be null if you leave define <code>VMA_STATIC_VULKAN_FUNCTIONS 1</code>.  <a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">More...</a><br /></td></tr>
 <tr class="separator:a3dc197be3227da7338b1643f70db36bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ace2aa4877b16a42b0b7673d4e26000ee"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a></td></tr>
-<tr class="memdesc:ace2aa4877b16a42b0b7673d4e26000ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for recording of VMA calls. Can be null.  <a href="#ace2aa4877b16a42b0b7673d4e26000ee">More...</a><br /></td></tr>
+<tr class="memdesc:ace2aa4877b16a42b0b7673d4e26000ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for recording of VMA calls. Can be null.  <a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">More...</a><br /></td></tr>
 <tr class="separator:ace2aa4877b16a42b0b7673d4e26000ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70dd42e29b1df1d1b9b61532ae0b370b"><td class="memItemLeft" align="right" valign="top">VkInstance&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a></td></tr>
+<tr class="memdesc:a70dd42e29b1df1d1b9b61532ae0b370b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional handle to Vulkan instance object.  <a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">More...</a><br /></td></tr>
+<tr class="separator:a70dd42e29b1df1d1b9b61532ae0b370b"><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>Description of a Allocator to be created. </p>
@@ -162,6 +165,23 @@
 
 </div>
 </div>
+<a id="a70dd42e29b1df1d1b9b61532ae0b370b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a70dd42e29b1df1d1b9b61532ae0b370b">&#9670;&nbsp;</a></span>instance</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkInstance VmaAllocatorCreateInfo::instance</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Optional handle to Vulkan instance object. </p>
+<p>Optional, can be null. Must be set if <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> flas is used. </p>
+
+</div>
+</div>
 <a id="a6e409087e3be55400d0e4ccbe43c608d"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a6e409087e3be55400d0e4ccbe43c608d">&#9670;&nbsp;</a></span>pAllocationCallbacks</h2>
 
@@ -214,7 +234,7 @@
 <p>If there is a limit defined for a heap:</p>
 <ul>
 <li>If user tries to allocate more memory from that heap using this allocator, the allocation fails with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>.</li>
-<li>If the limit is smaller than heap size reported in <code>VkMemoryHeap::size</code>, the value of this limit will be reported instead when using <a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties()</a>.</li>
+<li>If the limit is smaller than heap size reported in <code>VkMemoryHeap::size</code>, the value of this limit will be reported instead when using <a class="el" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties()</a>.</li>
 </ul>
 <p>Warning! Using this feature may not be equivalent to installing a GPU with smaller amount of memory, because graphics driver doesn't necessary fail new allocations with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code> result when memory capacity is exceeded. It may return success and just silently migrate some device memory blocks to system RAM. This driver behavior can also be controlled using VK_AMD_memory_overallocation_behavior extension. </p>
 
@@ -297,7 +317,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_budget-members.html b/docs/html/struct_vma_budget-members.html
new file mode 100644
index 0000000..21f0017
--- /dev/null
+++ b/docs/html/struct_vma_budget-members.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.16"/>
+<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.16 -->
+<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">VmaBudget Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_vma_budget.html">VmaBudget</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a></td><td class="entry"><a class="el" href="struct_vma_budget.html">VmaBudget</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a></td><td class="entry"><a class="el" href="struct_vma_budget.html">VmaBudget</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a></td><td class="entry"><a class="el" href="struct_vma_budget.html">VmaBudget</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a></td><td class="entry"><a class="el" href="struct_vma_budget.html">VmaBudget</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.16
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_budget.html b/docs/html/struct_vma_budget.html
new file mode 100644
index 0000000..2403e24
--- /dev/null
+++ b/docs/html/struct_vma_budget.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.16"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaBudget 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.16 -->
+<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_budget-members.html">List of all members</a>  </div>
+  <div class="headertitle">
+<div class="title">VmaBudget Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Statistics of current memory usage and available budget, in bytes, for specific memory heap.  
+ <a href="struct_vma_budget.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:a58b492901baab685f466199124e514a0"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a></td></tr>
+<tr class="memdesc:a58b492901baab685f466199124e514a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum size of all <code>VkDeviceMemory</code> blocks allocated from particular heap, in bytes.  <a href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">More...</a><br /></td></tr>
+<tr class="separator:a58b492901baab685f466199124e514a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e2a6583ebd63e194951c542563804d8"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a></td></tr>
+<tr class="memdesc:a7e2a6583ebd63e194951c542563804d8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum size of all allocations created in particular heap, in bytes.  <a href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">More...</a><br /></td></tr>
+<tr class="separator:a7e2a6583ebd63e194951c542563804d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84dd1ecca8b0110259eb206dbadb11f6"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a></td></tr>
+<tr class="memdesc:a84dd1ecca8b0110259eb206dbadb11f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated current memory usage of the program, in bytes.  <a href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">More...</a><br /></td></tr>
+<tr class="separator:a84dd1ecca8b0110259eb206dbadb11f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab82e1d1754c2d210d0bdf90220bc6cdd"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a></td></tr>
+<tr class="memdesc:ab82e1d1754c2d210d0bdf90220bc6cdd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated amount of memory available to the program, in bytes.  <a href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">More...</a><br /></td></tr>
+<tr class="separator:ab82e1d1754c2d210d0bdf90220bc6cdd"><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 of current memory usage and available budget, in bytes, for specific memory heap. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="a7e2a6583ebd63e194951c542563804d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e2a6583ebd63e194951c542563804d8">&#9670;&nbsp;</a></span>allocationBytes</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaBudget::allocationBytes</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sum size of all allocations created in particular heap, in bytes. </p>
+<p>Always less or equal than <code>blockBytes</code>. Difference <code>blockBytes - allocationBytes</code> is the amount of memory allocated but unused - available for new allocations or wasted due to fragmentation. </p>
+
+</div>
+</div>
+<a id="a58b492901baab685f466199124e514a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58b492901baab685f466199124e514a0">&#9670;&nbsp;</a></span>blockBytes</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaBudget::blockBytes</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sum size of all <code>VkDeviceMemory</code> blocks allocated from particular heap, in bytes. </p>
+
+</div>
+</div>
+<a id="ab82e1d1754c2d210d0bdf90220bc6cdd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab82e1d1754c2d210d0bdf90220bc6cdd">&#9670;&nbsp;</a></span>budget</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaBudget::budget</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Estimated amount of memory available to the program, in bytes. </p>
+<p>Fetched from system using <code>VK_EXT_memory_budget</code> extension if enabled.</p>
+<p>It might be different (most probably smaller) than <code>VkMemoryHeap::size[heapIndex]</code> due to factors external to the program, like other programs also consuming system resources. Difference <code>budget - usage</code> is the amount of additional memory that can probably be allocated without problems. Exceeding the budget may result in various problems. </p>
+
+</div>
+</div>
+<a id="a84dd1ecca8b0110259eb206dbadb11f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84dd1ecca8b0110259eb206dbadb11f6">&#9670;&nbsp;</a></span>usage</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaBudget::usage</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Estimated current memory usage of the program, in bytes. </p>
+<p>Fetched from system using <code>VK_EXT_memory_budget</code> extension if enabled.</p>
+<p>It might be different than <code>blockBytes</code> (usually higher) due to additional implicit objects also occupying the memory, like swapchain, pipelines, descriptor heaps, command buffers, or <code>VkDeviceMemory</code> blocks allocated outside of this library, if any. </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.16
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_defragmentation_context.html b/docs/html/struct_vma_defragmentation_context.html
index 30b5445..06ba239 100644
--- a/docs/html/struct_vma_defragmentation_context.html
+++ b/docs/html/struct_vma_defragmentation_context.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -72,7 +72,7 @@
 <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>
+<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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" 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>
@@ -81,7 +81,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_defragmentation_info-members.html b/docs/html/struct_vma_defragmentation_info-members.html
index b16e0aa..ef75eb1 100644
--- a/docs/html/struct_vma_defragmentation_info-members.html
+++ b/docs/html/struct_vma_defragmentation_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -75,7 +75,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_defragmentation_info.html b/docs/html/struct_vma_defragmentation_info.html
index 2784192..0725b95 100644
--- a/docs/html/struct_vma_defragmentation_info.html
+++ b/docs/html/struct_vma_defragmentation_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -69,7 +69,7 @@
 </div><!--header-->
 <div class="contents">
 
-<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>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" 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>
@@ -77,15 +77,15 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:acb311c940a777270e67e1b81c5ab6a1d"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a></td></tr>
-<tr class="memdesc:acb311c940a777270e67e1b81c5ab6a1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum total numbers of bytes that can be copied while moving allocations to different places.  <a href="#acb311c940a777270e67e1b81c5ab6a1d">More...</a><br /></td></tr>
+<tr class="memdesc:acb311c940a777270e67e1b81c5ab6a1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum total numbers of bytes that can be copied while moving allocations to different places.  <a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">More...</a><br /></td></tr>
 <tr class="separator:acb311c940a777270e67e1b81c5ab6a1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa7c7304e13c71f604c907196c4e28fbc"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a></td></tr>
-<tr class="memdesc:aa7c7304e13c71f604c907196c4e28fbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of allocations that can be moved to different place.  <a href="#aa7c7304e13c71f604c907196c4e28fbc">More...</a><br /></td></tr>
+<tr class="memdesc:aa7c7304e13c71f604c907196c4e28fbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of allocations that can be moved to different place.  <a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">More...</a><br /></td></tr>
 <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>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 class="textblock"><p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" 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#a696fc71963b7711cc0db3cc2225d0cd7" 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>
@@ -129,7 +129,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_defragmentation_info2-members.html b/docs/html/struct_vma_defragmentation_info2-members.html
index 255c21b..affd397 100644
--- a/docs/html/struct_vma_defragmentation_info2-members.html
+++ b/docs/html/struct_vma_defragmentation_info2-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -84,7 +84,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_defragmentation_info2.html b/docs/html/struct_vma_defragmentation_info2.html
index 45535bb..098a413 100644
--- a/docs/html/struct_vma_defragmentation_info2.html
+++ b/docs/html/struct_vma_defragmentation_info2.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,42 +77,42 @@
 <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">Reserved for future use. Should be 0.  <a href="#a53e844ee5633e229cf6daf14b2d9fff9">More...</a><br /></td></tr>
+<tr class="memdesc:a53e844ee5633e229cf6daf14b2d9fff9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reserved for future use. Should be 0.  <a href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">More...</a><br /></td></tr>
 <tr class="separator:a53e844ee5633e229cf6daf14b2d9fff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3cf86ab32c1da779b4923d301a3056ba"><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#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a></td></tr>
-<tr class="memdesc:a3cf86ab32c1da779b4923d301a3056ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations in <code>pAllocations</code> array.  <a href="#a3cf86ab32c1da779b4923d301a3056ba">More...</a><br /></td></tr>
+<tr class="memdesc:a3cf86ab32c1da779b4923d301a3056ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations in <code>pAllocations</code> array.  <a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">More...</a><br /></td></tr>
 <tr class="separator:a3cf86ab32c1da779b4923d301a3056ba"><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="memdesc:a8943f8d65969ce8e2189a1cdf3205e96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to array of allocations that can be defragmented.  <a href="struct_vma_defragmentation_info2.html#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 during defragmentation.  <a href="#a76d51a644dc7f5405d0cdd0025ecd0cc">More...</a><br /></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 during defragmentation.  <a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">More...</a><br /></td></tr>
 <tr class="separator:a76d51a644dc7f5405d0cdd0025ecd0cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a7e70aa2a1081d849dcc7829b19d3ec9d"><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#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a></td></tr>
-<tr class="memdesc:a7e70aa2a1081d849dcc7829b19d3ec9d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Numer of pools in <code>pPools</code> array.  <a href="#a7e70aa2a1081d849dcc7829b19d3ec9d">More...</a><br /></td></tr>
+<tr class="memdesc:a7e70aa2a1081d849dcc7829b19d3ec9d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Numer of pools in <code>pPools</code> array.  <a href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">More...</a><br /></td></tr>
 <tr class="separator:a7e70aa2a1081d849dcc7829b19d3ec9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0b3effd57f3fcdeb2ed62210b4ef20e1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a></td></tr>
-<tr class="memdesc:a0b3effd57f3fcdeb2ed62210b4ef20e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either null or pointer to array of pools to be defragmented.  <a href="#a0b3effd57f3fcdeb2ed62210b4ef20e1">More...</a><br /></td></tr>
+<tr class="memdesc:a0b3effd57f3fcdeb2ed62210b4ef20e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either null or pointer to array of pools to be defragmented.  <a href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">More...</a><br /></td></tr>
 <tr class="separator:a0b3effd57f3fcdeb2ed62210b4ef20e1"><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="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="struct_vma_defragmentation_info2.html#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="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="struct_vma_defragmentation_info2.html#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="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="struct_vma_defragmentation_info2.html#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="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="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">More...</a><br /></td></tr>
 <tr class="separator:a40d53d33e71ba0b66f844ed63c05a3f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a7f71f39590c5316771493d2333f9c1bd"><td class="memItemLeft" align="right" valign="top">VkCommandBuffer&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a></td></tr>
-<tr class="memdesc:a7f71f39590c5316771493d2333f9c1bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional. Command buffer where GPU copy commands will be posted.  <a href="#a7f71f39590c5316771493d2333f9c1bd">More...</a><br /></td></tr>
+<tr class="memdesc:a7f71f39590c5316771493d2333f9c1bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional. Command buffer where GPU copy commands will be posted.  <a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">More...</a><br /></td></tr>
 <tr class="separator:a7f71f39590c5316771493d2333f9c1bd"><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>
+<p>To be used with function <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="a3cf86ab32c1da779b4923d301a3056ba"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a3cf86ab32c1da779b4923d301a3056ba">&#9670;&nbsp;</a></span>allocationCount</h2>
@@ -143,7 +143,7 @@
 </div><div class="memdoc">
 
 <p>Optional. Command buffer where GPU copy commands will be posted. </p>
-<p>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 <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>.</p>
+<p>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 <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>.</p>
 <p>Passing null means that only CPU defragmentation will be performed. </p>
 
 </div>
@@ -295,7 +295,7 @@
 </div><div class="memdoc">
 
 <p>Either null or pointer to array of pools to be defragmented. </p>
-<p>All the allocations in the specified pools can be moved during defragmentation and there is no way to check if they were really moved as in <code>pAllocationsChanged</code>, so you must query all the allocations in all these pools for new <code>VkDeviceMemory</code> and offset 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 might need to recreate buffers and images bound to them.</p>
+<p>All the allocations in the specified pools can be moved during defragmentation and there is no way to check if they were really moved as in <code>pAllocationsChanged</code>, so you must query all the allocations in all these pools for new <code>VkDeviceMemory</code> and offset using <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you might need to recreate buffers and images bound to them.</p>
 <p>The array should have <code>poolCount</code> elements. The array should not contain nulls. Elements in the array should be unique - same pool cannot occur twice.</p>
 <p>Using this array is equivalent to specifying all allocations from the pools in <code>pAllocations</code>. It might be more efficient. </p>
 
@@ -309,7 +309,7 @@
 <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.15
+</a> 1.8.16
 </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 44c2385..e816f97 100644
--- a/docs/html/struct_vma_defragmentation_stats-members.html
+++ b/docs/html/struct_vma_defragmentation_stats-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,7 +77,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_defragmentation_stats.html b/docs/html/struct_vma_defragmentation_stats.html
index 48cf77a..00b8c2d 100644
--- a/docs/html/struct_vma_defragmentation_stats.html
+++ b/docs/html/struct_vma_defragmentation_stats.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -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="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>.  
+<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" 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>
@@ -77,20 +77,20 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a36f9d5df2a10ba2a36b16e126d60572d"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a></td></tr>
-<tr class="memdesc:a36f9d5df2a10ba2a36b16e126d60572d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes that have been copied while moving allocations to different places.  <a href="#a36f9d5df2a10ba2a36b16e126d60572d">More...</a><br /></td></tr>
+<tr class="memdesc:a36f9d5df2a10ba2a36b16e126d60572d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes that have been copied while moving allocations to different places.  <a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">More...</a><br /></td></tr>
 <tr class="separator:a36f9d5df2a10ba2a36b16e126d60572d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ab0cb9ac0dbc106c77e384ea676422f28"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a></td></tr>
-<tr class="memdesc:ab0cb9ac0dbc106c77e384ea676422f28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes that have been released to the system by freeing empty <code>VkDeviceMemory</code> objects.  <a href="#ab0cb9ac0dbc106c77e384ea676422f28">More...</a><br /></td></tr>
+<tr class="memdesc:ab0cb9ac0dbc106c77e384ea676422f28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes that have been released to the system by freeing empty <code>VkDeviceMemory</code> objects.  <a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">More...</a><br /></td></tr>
 <tr class="separator:ab0cb9ac0dbc106c77e384ea676422f28"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aefeabf130022008eadd75999478af3f9"><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#aefeabf130022008eadd75999478af3f9">allocationsMoved</a></td></tr>
-<tr class="memdesc:aefeabf130022008eadd75999478af3f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations that have been moved to different places.  <a href="#aefeabf130022008eadd75999478af3f9">More...</a><br /></td></tr>
+<tr class="memdesc:aefeabf130022008eadd75999478af3f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations that have been moved to different places.  <a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">More...</a><br /></td></tr>
 <tr class="separator:aefeabf130022008eadd75999478af3f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <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="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="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">More...</a><br /></td></tr>
 <tr class="separator:a0113f1877904a5d1ee8f409216ff276b"><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="Deprecated. 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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="aefeabf130022008eadd75999478af3f9"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aefeabf130022008eadd75999478af3f9">&#9670;&nbsp;</a></span>allocationsMoved</h2>
@@ -164,7 +164,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_device_memory_callbacks-members.html b/docs/html/struct_vma_device_memory_callbacks-members.html
index ef83427..b032e99 100644
--- a/docs/html/struct_vma_device_memory_callbacks-members.html
+++ b/docs/html/struct_vma_device_memory_callbacks-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -75,7 +75,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_device_memory_callbacks.html b/docs/html/struct_vma_device_memory_callbacks.html
index 0f60d99..d8adf82 100644
--- a/docs/html/struct_vma_device_memory_callbacks.html
+++ b/docs/html/struct_vma_device_memory_callbacks.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDeviceMemoryCallbacks Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,10 +77,10 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a4f17f7b255101e733b44d5633aceabfb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a></td></tr>
-<tr class="memdesc:a4f17f7b255101e733b44d5633aceabfb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional, can be null.  <a href="#a4f17f7b255101e733b44d5633aceabfb">More...</a><br /></td></tr>
+<tr class="memdesc:a4f17f7b255101e733b44d5633aceabfb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional, can be null.  <a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">More...</a><br /></td></tr>
 <tr class="separator:a4f17f7b255101e733b44d5633aceabfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:abe8a3328bbc916f6f712fdb6b299444c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a></td></tr>
-<tr class="memdesc:abe8a3328bbc916f6f712fdb6b299444c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional, can be null.  <a href="#abe8a3328bbc916f6f712fdb6b299444c">More...</a><br /></td></tr>
+<tr class="memdesc:abe8a3328bbc916f6f712fdb6b299444c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional, can be null.  <a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">More...</a><br /></td></tr>
 <tr class="separator:abe8a3328bbc916f6f712fdb6b299444c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@@ -128,7 +128,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_pool.html b/docs/html/struct_vma_pool.html
index 72bbc7f..0725e08 100644
--- a/docs/html/struct_vma_pool.html
+++ b/docs/html/struct_vma_pool.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPool Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -72,7 +72,7 @@
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Represents custom memory pool. </p>
-<p>Fill structure <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool.">VmaPoolCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1" title="Destroys VmaPool object and frees Vulkan device memory.">vmaDestroyPool()</a> to destroy it.</p>
+<p>Fill structure <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool.">VmaPoolCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849" title="Destroys VmaPool object and frees Vulkan device memory.">vmaDestroyPool()</a> to destroy it.</p>
 <p>For more information see <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
 <li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
@@ -82,7 +82,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_pool_create_info-members.html b/docs/html/struct_vma_pool_create_info-members.html
index 722668c..68e8102 100644
--- a/docs/html/struct_vma_pool_create_info-members.html
+++ b/docs/html/struct_vma_pool_create_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -79,7 +79,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_pool_create_info.html b/docs/html/struct_vma_pool_create_info.html
index 5168ad5..d43283c 100644
--- a/docs/html/struct_vma_pool_create_info.html
+++ b/docs/html/struct_vma_pool_create_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPoolCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,22 +77,22 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a596fa76b685d3f1f688f84a709a5b319"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a></td></tr>
-<tr class="memdesc:a596fa76b685d3f1f688f84a709a5b319"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan memory type index to allocate this pool from.  <a href="#a596fa76b685d3f1f688f84a709a5b319">More...</a><br /></td></tr>
+<tr class="memdesc:a596fa76b685d3f1f688f84a709a5b319"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan memory type index to allocate this pool from.  <a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">More...</a><br /></td></tr>
 <tr class="separator:a596fa76b685d3f1f688f84a709a5b319"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8405139f63d078340ae74513a59f5446"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a></td></tr>
-<tr class="memdesc:a8405139f63d078340ae74513a59f5446"><td class="mdescLeft">&#160;</td><td class="mdescRight">Use combination of <a class="el" href="vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f" title="Flags to be passed as VmaPoolCreateInfo::flags.">VmaPoolCreateFlagBits</a>.  <a href="#a8405139f63d078340ae74513a59f5446">More...</a><br /></td></tr>
+<tr class="memdesc:a8405139f63d078340ae74513a59f5446"><td class="mdescLeft">&#160;</td><td class="mdescRight">Use combination of <a class="el" href="vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f" title="Flags to be passed as VmaPoolCreateInfo::flags.">VmaPoolCreateFlagBits</a>.  <a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">More...</a><br /></td></tr>
 <tr class="separator:a8405139f63d078340ae74513a59f5446"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa4265160536cdb9be821b7686c16c676"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a></td></tr>
-<tr class="memdesc:aa4265160536cdb9be821b7686c16c676"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of a single <code>VkDeviceMemory</code> block to be allocated as part of this pool, in bytes. Optional.  <a href="#aa4265160536cdb9be821b7686c16c676">More...</a><br /></td></tr>
+<tr class="memdesc:aa4265160536cdb9be821b7686c16c676"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of a single <code>VkDeviceMemory</code> block to be allocated as part of this pool, in bytes. Optional.  <a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">More...</a><br /></td></tr>
 <tr class="separator:aa4265160536cdb9be821b7686c16c676"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad8006fb803185c0a699d30f3e9a865ae"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a></td></tr>
-<tr class="memdesc:ad8006fb803185c0a699d30f3e9a865ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Minimum number of blocks to be always allocated in this pool, even if they stay empty.  <a href="#ad8006fb803185c0a699d30f3e9a865ae">More...</a><br /></td></tr>
+<tr class="memdesc:ad8006fb803185c0a699d30f3e9a865ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Minimum number of blocks to be always allocated in this pool, even if they stay empty.  <a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">More...</a><br /></td></tr>
 <tr class="separator:ad8006fb803185c0a699d30f3e9a865ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae41142f2834fcdc82baa4883c187b75c"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a></td></tr>
-<tr class="memdesc:ae41142f2834fcdc82baa4883c187b75c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of blocks that can be allocated in this pool. Optional.  <a href="#ae41142f2834fcdc82baa4883c187b75c">More...</a><br /></td></tr>
+<tr class="memdesc:ae41142f2834fcdc82baa4883c187b75c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of blocks that can be allocated in this pool. Optional.  <a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">More...</a><br /></td></tr>
 <tr class="separator:ae41142f2834fcdc82baa4883c187b75c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a></td></tr>
-<tr class="memdesc:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="#a9437e43ffbb644dbbf7fc4e50cfad6aa">More...</a><br /></td></tr>
+<tr class="memdesc:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">More...</a><br /></td></tr>
 <tr class="separator:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@@ -210,7 +210,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_pool_stats-members.html b/docs/html/struct_vma_pool_stats-members.html
index 07773dd..90af38d 100644
--- a/docs/html/struct_vma_pool_stats-members.html
+++ b/docs/html/struct_vma_pool_stats-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -79,7 +79,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_pool_stats.html b/docs/html/struct_vma_pool_stats.html
index a0fc2c7..ed5c8e9 100644
--- a/docs/html/struct_vma_pool_stats.html
+++ b/docs/html/struct_vma_pool_stats.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPoolStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,22 +77,22 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:a326807b2de2b0931cee4ed9a5f2e420c"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a></td></tr>
-<tr class="memdesc:a326807b2de2b0931cee4ed9a5f2e420c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total amount of <code>VkDeviceMemory</code> allocated from Vulkan for this pool, in bytes.  <a href="#a326807b2de2b0931cee4ed9a5f2e420c">More...</a><br /></td></tr>
+<tr class="memdesc:a326807b2de2b0931cee4ed9a5f2e420c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total amount of <code>VkDeviceMemory</code> allocated from Vulkan for this pool, in bytes.  <a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">More...</a><br /></td></tr>
 <tr class="separator:a326807b2de2b0931cee4ed9a5f2e420c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad7c54874724fce7b06aba526202d82a8"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a></td></tr>
-<tr class="memdesc:ad7c54874724fce7b06aba526202d82a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>.  <a href="#ad7c54874724fce7b06aba526202d82a8">More...</a><br /></td></tr>
+<tr class="memdesc:ad7c54874724fce7b06aba526202d82a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>.  <a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">More...</a><br /></td></tr>
 <tr class="separator:ad7c54874724fce7b06aba526202d82a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a></td></tr>
-<tr class="memdesc:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects created from this pool that were not destroyed or lost.  <a href="#ad1924eb54fffa45e9e0e65670c8fe5eb">More...</a><br /></td></tr>
+<tr class="memdesc:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects created from this pool that were not destroyed or lost.  <a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">More...</a><br /></td></tr>
 <tr class="separator:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a></td></tr>
-<tr class="memdesc:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of continuous memory ranges in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>.  <a href="#ae4f3546ffa4d1e598b64d8e6134854f4">More...</a><br /></td></tr>
+<tr class="memdesc:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of continuous memory ranges in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>.  <a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">More...</a><br /></td></tr>
 <tr class="separator:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a></td></tr>
-<tr class="memdesc:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of the largest continuous free memory region available for new allocation.  <a href="#ab4c8f52dd42ab01998f60f0b6acc722b">More...</a><br /></td></tr>
+<tr class="memdesc:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of the largest continuous free memory region available for new allocation.  <a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">More...</a><br /></td></tr>
 <tr class="separator:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa0b5cb45cef6f18571cefb03b9a230e7"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a></td></tr>
-<tr class="memdesc:aa0b5cb45cef6f18571cefb03b9a230e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VkDeviceMemory</code> blocks allocated for this pool.  <a href="#aa0b5cb45cef6f18571cefb03b9a230e7">More...</a><br /></td></tr>
+<tr class="memdesc:aa0b5cb45cef6f18571cefb03b9a230e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VkDeviceMemory</code> blocks allocated for this pool.  <a href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">More...</a><br /></td></tr>
 <tr class="separator:aa0b5cb45cef6f18571cefb03b9a230e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@@ -203,7 +203,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_record_settings-members.html b/docs/html/struct_vma_record_settings-members.html
index 8284308..523b85b 100644
--- a/docs/html/struct_vma_record_settings-members.html
+++ b/docs/html/struct_vma_record_settings-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -75,7 +75,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_record_settings.html b/docs/html/struct_vma_record_settings.html
index 8d35534..70e84e6 100644
--- a/docs/html/struct_vma_record_settings.html
+++ b/docs/html/struct_vma_record_settings.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaRecordSettings Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,10 +77,10 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a></td></tr>
-<tr class="memdesc:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for recording. Use <a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4" title="Flags to be used in VmaRecordSettings::flags.">VmaRecordFlagBits</a> enum.  <a href="#ad8fdcc92119ae7a8c08c1a564c01d63a">More...</a><br /></td></tr>
+<tr class="memdesc:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for recording. Use <a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4" title="Flags to be used in VmaRecordSettings::flags.">VmaRecordFlagBits</a> enum.  <a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">More...</a><br /></td></tr>
 <tr class="separator:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a></td></tr>
-<tr class="memdesc:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Path to the file that should be written by the recording.  <a href="#a6cb1fdbf6bcb610b68f2010dd629e89d">More...</a><br /></td></tr>
+<tr class="memdesc:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Path to the file that should be written by the recording.  <a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">More...</a><br /></td></tr>
 <tr class="separator:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
@@ -127,7 +127,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_stat_info-members.html b/docs/html/struct_vma_stat_info-members.html
index 7957473..a46b297 100644
--- a/docs/html/struct_vma_stat_info-members.html
+++ b/docs/html/struct_vma_stat_info-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -84,7 +84,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_stat_info.html b/docs/html/struct_vma_stat_info.html
index b5411cf..717b5df 100644
--- a/docs/html/struct_vma_stat_info.html
+++ b/docs/html/struct_vma_stat_info.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaStatInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -77,19 +77,19 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
 <tr class="memitem:abc4bb7cd611900778464c56e50c970a4"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a></td></tr>
-<tr class="memdesc:abc4bb7cd611900778464c56e50c970a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VkDeviceMemory</code> Vulkan memory blocks allocated.  <a href="#abc4bb7cd611900778464c56e50c970a4">More...</a><br /></td></tr>
+<tr class="memdesc:abc4bb7cd611900778464c56e50c970a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VkDeviceMemory</code> Vulkan memory blocks allocated.  <a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">More...</a><br /></td></tr>
 <tr class="separator:abc4bb7cd611900778464c56e50c970a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a537741e4d5cdddc1c0ab95ec650afaff"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a></td></tr>
-<tr class="memdesc:a537741e4d5cdddc1c0ab95ec650afaff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> allocation objects allocated.  <a href="#a537741e4d5cdddc1c0ab95ec650afaff">More...</a><br /></td></tr>
+<tr class="memdesc:a537741e4d5cdddc1c0ab95ec650afaff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> allocation objects allocated.  <a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">More...</a><br /></td></tr>
 <tr class="separator:a537741e4d5cdddc1c0ab95ec650afaff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae06129c771bfebfd6468a7f4276502a9"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a></td></tr>
-<tr class="memdesc:ae06129c771bfebfd6468a7f4276502a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of free ranges of memory between allocations.  <a href="#ae06129c771bfebfd6468a7f4276502a9">More...</a><br /></td></tr>
+<tr class="memdesc:ae06129c771bfebfd6468a7f4276502a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of free ranges of memory between allocations.  <a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">More...</a><br /></td></tr>
 <tr class="separator:ae06129c771bfebfd6468a7f4276502a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ab0c6c73837e5a70c749fbd4f6064895a"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a></td></tr>
-<tr class="memdesc:ab0c6c73837e5a70c749fbd4f6064895a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes occupied by all allocations.  <a href="#ab0c6c73837e5a70c749fbd4f6064895a">More...</a><br /></td></tr>
+<tr class="memdesc:ab0c6c73837e5a70c749fbd4f6064895a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes occupied by all allocations.  <a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">More...</a><br /></td></tr>
 <tr class="separator:ab0c6c73837e5a70c749fbd4f6064895a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a1859d290aca2cd582d8dc25922092669"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a></td></tr>
-<tr class="memdesc:a1859d290aca2cd582d8dc25922092669"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes occupied by unused ranges.  <a href="#a1859d290aca2cd582d8dc25922092669">More...</a><br /></td></tr>
+<tr class="memdesc:a1859d290aca2cd582d8dc25922092669"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes occupied by unused ranges.  <a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">More...</a><br /></td></tr>
 <tr class="separator:a1859d290aca2cd582d8dc25922092669"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ade8b40bd3139c04aabd2fc538a356fea"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a></td></tr>
 <tr class="separator:ade8b40bd3139c04aabd2fc538a356fea"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -279,7 +279,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_stats-members.html b/docs/html/struct_vma_stats-members.html
index 7cf7eb7..3351862 100644
--- a/docs/html/struct_vma_stats-members.html
+++ b/docs/html/struct_vma_stats-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -76,7 +76,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_stats.html b/docs/html/struct_vma_stats.html
index 8a567a0..6a8b3a5 100644
--- a/docs/html/struct_vma_stats.html
+++ b/docs/html/struct_vma_stats.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -136,7 +136,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_vulkan_functions-members.html b/docs/html/struct_vma_vulkan_functions-members.html
index 96f3fb4..58893cd 100644
--- a/docs/html/struct_vma_vulkan_functions-members.html
+++ b/docs/html/struct_vma_vulkan_functions-members.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <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"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -90,7 +90,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/struct_vma_vulkan_functions.html b/docs/html/struct_vma_vulkan_functions.html
index 148429a..6aed6f5 100644
--- a/docs/html/struct_vma_vulkan_functions.html
+++ b/docs/html/struct_vma_vulkan_functions.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaVulkanFunctions Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -361,7 +361,7 @@
 <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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/tabs.css b/docs/html/tabs.css
index 8ea7d54..85a0cd5 100644
--- a/docs/html/tabs.css
+++ b/docs/html/tabs.css
@@ -1 +1 @@
-.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
\ No newline at end of file
diff --git a/docs/html/usage_patterns.html b/docs/html/usage_patterns.html
index 055e689..1beac82 100644
--- a/docs/html/usage_patterns.html
+++ b/docs/html/usage_patterns.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Recommended usage patterns</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -125,13 +121,13 @@
 </ol>
 <p>You should take some measurements to decide which option is faster in case of your specific resource.</p>
 <p>If you don't want to specialize your code for specific types of GPUs, you can still make an simple optimization for cases when your resource ends up in mappable memory to use it directly in this case instead of creating CPU-side staging copy. For details see <a class="el" href="memory_mapping.html#memory_mapping_finding_if_memory_mappable">Finding out if memory is mappable</a>. </p>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/vk__mem__alloc_8h.html b/docs/html/vk__mem__alloc_8h.html
index 3f9d4bd..e724aa3 100644
--- a/docs/html/vk__mem__alloc_8h.html
+++ b/docs/html/vk__mem__alloc_8h.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: vk_mem_alloc.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -95,6 +95,9 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stats.html">VmaStats</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from current state of Allocator.  <a href="struct_vma_stats.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_budget.html">VmaBudget</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget, in bytes, for specific memory heap.  <a href="struct_vma_budget.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td></tr>
@@ -104,16 +107,16 @@
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>.  <a href="struct_vma_pool_stats.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <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="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#ae10b53588f197141c6e88a1f5ec34789" 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">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="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#a2c33b164a2597db181db3ca8e5812e4c" 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="Deprecated. 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#a2c33b164a2597db181db3ca8e5812e4c" 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>
@@ -126,89 +129,102 @@
 <tr class="separator:af7b860e63b96d11e44ae8587ba06bbf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a88bef97f86d70a34a4c0746e09a2680d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d">VMA_BIND_MEMORY2</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:a88bef97f86d70a34a4c0746e09a2680d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05decf1cf4ebf767beba7acca6c1ec3a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">VMA_MEMORY_BUDGET</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a05decf1cf4ebf767beba7acca6c1ec3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f0fa870030b4d421bf71e3928d5fe31"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a></td></tr>
+<tr class="separator:a3f0fa870030b4d421bf71e3928d5fe31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab7d949b3d77783f0ba704ae5e3136e0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a></td></tr>
+<tr class="separator:aab7d949b3d77783f0ba704ae5e3136e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae25f0d55fd91cb166f002b63244800e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">VMA_STATS_STRING_ENABLED</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ae25f0d55fd91cb166f002b63244800e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
 <tr class="memitem:ab6a6477cda1ce775b30bde96d766203b"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
-<tr class="memdesc:ab6a6477cda1ce775b30bde96d766203b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called after successful vkAllocateMemory.  <a href="#ab6a6477cda1ce775b30bde96d766203b">More...</a><br /></td></tr>
+<tr class="memdesc:ab6a6477cda1ce775b30bde96d766203b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called after successful vkAllocateMemory.  <a href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">More...</a><br /></td></tr>
 <tr class="separator:ab6a6477cda1ce775b30bde96d766203b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
-<tr class="memdesc:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called before vkFreeMemory.  <a href="#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">More...</a><br /></td></tr>
+<tr class="memdesc:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called before vkFreeMemory.  <a href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">More...</a><br /></td></tr>
 <tr class="separator:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5e2eb68d727cfd4df25702b027b7aa31"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a></td></tr>
-<tr class="memdesc:a5e2eb68d727cfd4df25702b027b7aa31"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code>.  <a href="#a5e2eb68d727cfd4df25702b027b7aa31">More...</a><br /></td></tr>
+<tr class="memdesc:a5e2eb68d727cfd4df25702b027b7aa31"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code>.  <a href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">More...</a><br /></td></tr>
 <tr class="separator:a5e2eb68d727cfd4df25702b027b7aa31"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4ddf381b6ce795bdfbc6c614640b9915"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915">VmaAllocatorCreateFlagBits</a></td></tr>
-<tr class="memdesc:a4ddf381b6ce795bdfbc6c614640b9915"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>.  <a href="#a4ddf381b6ce795bdfbc6c614640b9915">More...</a><br /></td></tr>
+<tr class="memdesc:a4ddf381b6ce795bdfbc6c614640b9915"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>.  <a href="vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915">More...</a><br /></td></tr>
 <tr class="separator:a4ddf381b6ce795bdfbc6c614640b9915"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acfe6863e160722c2c1bbcf7573fddc4d"><td class="memItemLeft" align="right" valign="top">typedef VkFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></td></tr>
 <tr class="separator:acfe6863e160722c2c1bbcf7573fddc4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a97064a1a271b0061ebfc3a079862d0c5"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a></td></tr>
-<tr class="memdesc:a97064a1a271b0061ebfc3a079862d0c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to some Vulkan functions - a subset used by the library.  <a href="#a97064a1a271b0061ebfc3a079862d0c5">More...</a><br /></td></tr>
+<tr class="memdesc:a97064a1a271b0061ebfc3a079862d0c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to some Vulkan functions - a subset used by the library.  <a href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">More...</a><br /></td></tr>
 <tr class="separator:a97064a1a271b0061ebfc3a079862d0c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ade20b626a6635ce1bf30ea53dea774e4"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4">VmaRecordFlagBits</a></td></tr>
-<tr class="memdesc:ade20b626a6635ce1bf30ea53dea774e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum.">VmaRecordSettings::flags</a>.  <a href="#ade20b626a6635ce1bf30ea53dea774e4">More...</a><br /></td></tr>
+<tr class="memdesc:ade20b626a6635ce1bf30ea53dea774e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum.">VmaRecordSettings::flags</a>.  <a href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4">More...</a><br /></td></tr>
 <tr class="separator:ade20b626a6635ce1bf30ea53dea774e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af3929a1a4547c592fc0b0e55ef452828"><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#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></td></tr>
 <tr class="separator:af3929a1a4547c592fc0b0e55ef452828"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a></td></tr>
-<tr class="memdesc:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">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>.  <a href="#a0ab61e87ff6365f1d59915eadc37a9f0">More...</a><br /></td></tr>
+<tr class="memdesc:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">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>.  <a href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">More...</a><br /></td></tr>
 <tr class="separator:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae0f6d1d733dded220d28134da46b4283"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a></td></tr>
-<tr class="memdesc:ae0f6d1d733dded220d28134da46b4283"><td class="mdescLeft">&#160;</td><td class="mdescRight">Description of a Allocator to be created.  <a href="#ae0f6d1d733dded220d28134da46b4283">More...</a><br /></td></tr>
+<tr class="memdesc:ae0f6d1d733dded220d28134da46b4283"><td class="mdescLeft">&#160;</td><td class="mdescRight">Description of a Allocator to be created.  <a href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">More...</a><br /></td></tr>
 <tr class="separator:ae0f6d1d733dded220d28134da46b4283"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a810b009a788ee8aac72a25b42ffbe31c"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a></td></tr>
-<tr class="memdesc:a810b009a788ee8aac72a25b42ffbe31c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage in entire allocator.  <a href="#a810b009a788ee8aac72a25b42ffbe31c">More...</a><br /></td></tr>
+<tr class="memdesc:a810b009a788ee8aac72a25b42ffbe31c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage in entire allocator.  <a href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">More...</a><br /></td></tr>
 <tr class="separator:a810b009a788ee8aac72a25b42ffbe31c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a732be855fb4a7c248e6853d928a729af"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a></td></tr>
-<tr class="memdesc:a732be855fb4a7c248e6853d928a729af"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from current state of Allocator.  <a href="#a732be855fb4a7c248e6853d928a729af">More...</a><br /></td></tr>
+<tr class="memdesc:a732be855fb4a7c248e6853d928a729af"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from current state of Allocator.  <a href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">More...</a><br /></td></tr>
 <tr class="separator:a732be855fb4a7c248e6853d928a729af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab79b48b6d25aada0de91a913896e1c38"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_budget.html">VmaBudget</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">VmaBudget</a></td></tr>
+<tr class="memdesc:ab79b48b6d25aada0de91a913896e1c38"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget, in bytes, for specific memory heap.  <a href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">More...</a><br /></td></tr>
+<tr class="separator:ab79b48b6d25aada0de91a913896e1c38"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad63b2113c0bfdbeade1cb498f5a8580d"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d">VmaMemoryUsage</a></td></tr>
 <tr class="separator:ad63b2113c0bfdbeade1cb498f5a8580d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:abf6bf6748c7a9fe7ce5b7835c0f56af4"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4">VmaAllocationCreateFlagBits</a></td></tr>
-<tr class="memdesc:abf6bf6748c7a9fe7ce5b7835c0f56af4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>.  <a href="#abf6bf6748c7a9fe7ce5b7835c0f56af4">More...</a><br /></td></tr>
+<tr class="memdesc:abf6bf6748c7a9fe7ce5b7835c0f56af4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>.  <a href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4">More...</a><br /></td></tr>
 <tr class="separator:abf6bf6748c7a9fe7ce5b7835c0f56af4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5225e5e11f8376f6a31a1791f3d6e817"><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#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></td></tr>
 <tr class="separator:a5225e5e11f8376f6a31a1791f3d6e817"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a86c44f9950b40d50088ed93a17870a7a"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a></td></tr>
 <tr class="separator:a86c44f9950b40d50088ed93a17870a7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8f93195158e0e2ac80ca352064e71c1f"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f">VmaPoolCreateFlagBits</a></td></tr>
-<tr class="memdesc:a8f93195158e0e2ac80ca352064e71c1f"><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="#a8f93195158e0e2ac80ca352064e71c1f">More...</a><br /></td></tr>
+<tr class="memdesc:a8f93195158e0e2ac80ca352064e71c1f"><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#a8f93195158e0e2ac80ca352064e71c1f">More...</a><br /></td></tr>
 <tr class="separator:a8f93195158e0e2ac80ca352064e71c1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2770e325ea42e087c1b91fdf46d0292a"><td class="memItemLeft" align="right" valign="top">typedef VkFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></td></tr>
 <tr class="separator:a2770e325ea42e087c1b91fdf46d0292a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a211706e9348dcee25a843ed4ea69bce7"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a></td></tr>
-<tr class="memdesc:a211706e9348dcee25a843ed4ea69bce7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>.  <a href="#a211706e9348dcee25a843ed4ea69bce7">More...</a><br /></td></tr>
+<tr class="memdesc:a211706e9348dcee25a843ed4ea69bce7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>.  <a href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">More...</a><br /></td></tr>
 <tr class="separator:a211706e9348dcee25a843ed4ea69bce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2e5612d871d64c5624087b837a338c34"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a></td></tr>
-<tr class="memdesc:a2e5612d871d64c5624087b837a338c34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>.  <a href="#a2e5612d871d64c5624087b837a338c34">More...</a><br /></td></tr>
+<tr class="memdesc:a2e5612d871d64c5624087b837a338c34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>.  <a href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">More...</a><br /></td></tr>
 <tr class="separator:a2e5612d871d64c5624087b837a338c34"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a795e6ff02a21d5486c0565f403dd9255"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a></td></tr>
-<tr class="memdesc:a795e6ff02a21d5486c0565f403dd9255"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <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="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#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  <a href="vk__mem__alloc_8h.html#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>. None at the moment. Reserved for future use.  <a href="#a96df0eddab2e1735782fe4e7cd05ea7f">More...</a><br /></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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use.  <a href="vk__mem__alloc_8h.html#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="memdesc:abac0e85abaa6ea1ffd63bde29c5c3a29"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for defragmentation.  <a href="vk__mem__alloc_8h.html#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">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="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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>.  <a href="vk__mem__alloc_8h.html#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="Deprecated. 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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>.  <a href="vk__mem__alloc_8h.html#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>
 Enumerations</h2></td></tr>
-<tr class="memitem:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001, 
+<tr class="memitem:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> { <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001, 
 <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002, 
 <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008, 
+<br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<br />
  }</td></tr>
 <tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>.  <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr>
 <tr class="separator:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -239,15 +255,17 @@
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040, 
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080, 
 <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000, 
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100, 
+<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000, 
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000, 
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT, 
 <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT, 
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT, 
+<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT, 
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT, 
 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
 <br />
  }</td></tr>
 <tr class="memdesc:ad9889c10c798b040d59c92f257cae597"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>.  <a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">More...</a><br /></td></tr>
@@ -265,138 +283,141 @@
 <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> { <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
  }</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>. None at the moment. Reserved for future use.  <a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">More...</a><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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use.  <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>
-<tr class="memitem:a200692051ddb34240248234f5f4c17bb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a> (const <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocator.html">VmaAllocator</a> *pAllocator)</td></tr>
-<tr class="memdesc:a200692051ddb34240248234f5f4c17bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates Allocator object.  <a href="#a200692051ddb34240248234f5f4c17bb">More...</a><br /></td></tr>
-<tr class="separator:a200692051ddb34240248234f5f4c17bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</td></tr>
-<tr class="memdesc:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys allocator object.  <a href="#aa8d164061c88f22fb1fd3c8f3534bc1d">More...</a><br /></td></tr>
-<tr class="separator:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aecabf7b6e91ea87d0316fa0a9e014fe0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</td></tr>
-<tr class="separator:aecabf7b6e91ea87d0316fa0a9e014fe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab88db292a17974f911182543fda52d19"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</td></tr>
-<tr class="separator:ab88db292a17974f911182543fda52d19"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8701444752eb5de4464adb5a2b514bca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</td></tr>
-<tr class="memdesc:a8701444752eb5de4464adb5a2b514bca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Given Memory Type Index, returns Property Flags of this memory type.  <a href="#a8701444752eb5de4464adb5a2b514bca">More...</a><br /></td></tr>
-<tr class="separator:a8701444752eb5de4464adb5a2b514bca"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t frameIndex)</td></tr>
-<tr class="memdesc:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets index of the current frame.  <a href="#ade56bf8dc9f5a5eaddf5f119ed525236">More...</a><br /></td></tr>
-<tr class="separator:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a333b61c1788cb23559177531e6a93ca3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_stats.html">VmaStats</a> *pStats)</td></tr>
-<tr class="memdesc:a333b61c1788cb23559177531e6a93ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from current state of the Allocator.  <a href="#a333b61c1788cb23559177531e6a93ca3">More...</a><br /></td></tr>
-<tr class="separator:a333b61c1788cb23559177531e6a93ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char **ppStatsString, VkBool32 detailedMap)</td></tr>
-<tr class="memdesc:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Builds and returns statistics as string in JSON format.  <a href="#aa4fee7eb5253377599ef4fd38c93c2a0">More...</a><br /></td></tr>
-<tr class="separator:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3104eb30d8122c84dd8541063f145288"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char *pStatsString)</td></tr>
-<tr class="separator:a3104eb30d8122c84dd8541063f145288"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aef15a94b58fbcb0fe706d5720e84a74a"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
-<tr class="memdesc:aef15a94b58fbcb0fe706d5720e84a74a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given memoryTypeBits and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#aef15a94b58fbcb0fe706d5720e84a74a">More...</a><br /></td></tr>
-<tr class="separator:aef15a94b58fbcb0fe706d5720e84a74a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae790ab9ffaf7667fb8f62523e6897888"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
-<tr class="memdesc:ae790ab9ffaf7667fb8f62523e6897888"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkBufferCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#ae790ab9ffaf7667fb8f62523e6897888">More...</a><br /></td></tr>
-<tr class="separator:ae790ab9ffaf7667fb8f62523e6897888"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a088da83d8eaf3ce9056d9ea0b981d472"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
-<tr class="memdesc:a088da83d8eaf3ce9056d9ea0b981d472"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkImageCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#a088da83d8eaf3ce9056d9ea0b981d472">More...</a><br /></td></tr>
-<tr class="separator:a088da83d8eaf3ce9056d9ea0b981d472"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_pool.html">VmaPool</a> *pPool)</td></tr>
-<tr class="memdesc:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates Vulkan device memory and creates <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object.  <a href="#a5c8770ded7c59c8caac6de0c2cb00b50">More...</a><br /></td></tr>
-<tr class="separator:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5485779c8f1948238fc4e92232fa65e1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool)</td></tr>
-<tr class="memdesc:a5485779c8f1948238fc4e92232fa65e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object and frees Vulkan device memory.  <a href="#a5485779c8f1948238fc4e92232fa65e1">More...</a><br /></td></tr>
-<tr class="separator:a5485779c8f1948238fc4e92232fa65e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae8bf76997b234ef68aad922616df4153"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a> *pPoolStats)</td></tr>
-<tr class="memdesc:ae8bf76997b234ef68aad922616df4153"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object.  <a href="#ae8bf76997b234ef68aad922616df4153">More...</a><br /></td></tr>
-<tr class="separator:ae8bf76997b234ef68aad922616df4153"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a736bd6cbda886f36c891727e73bd4024"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, size_t *pLostAllocationCount)</td></tr>
-<tr class="memdesc:a736bd6cbda886f36c891727e73bd4024"><td class="mdescLeft">&#160;</td><td class="mdescRight">Marks all allocations in given pool as lost if they are not used in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> back from now.  <a href="#a736bd6cbda886f36c891727e73bd4024">More...</a><br /></td></tr>
-<tr class="separator:a736bd6cbda886f36c891727e73bd4024"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad535935619c7a549bf837e1bb0068f89"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool)</td></tr>
-<tr class="memdesc:ad535935619c7a549bf837e1bb0068f89"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks magic number in margins around all allocations in given memory pool in search for corruptions.  <a href="#ad535935619c7a549bf837e1bb0068f89">More...</a><br /></td></tr>
-<tr class="separator:ad535935619c7a549bf837e1bb0068f89"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">General purpose memory allocation.  <a href="#abf28077dbf82d0908b8acbe8ee8dd9b8">More...</a><br /></td></tr>
-<tr class="separator:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad37e82e492b3de38fc3f4cffd9ad0ae1"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, size_t allocationCount, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:ad37e82e492b3de38fc3f4cffd9ad0ae1"><td class="mdescLeft">&#160;</td><td class="mdescRight">General purpose memory allocation for multiple allocation objects at once.  <a href="#ad37e82e492b3de38fc3f4cffd9ad0ae1">More...</a><br /></td></tr>
-<tr class="separator:ad37e82e492b3de38fc3f4cffd9ad0ae1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a7fdf64415b6c3d83c454f28d2c53df7b"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="separator:a7fdf64415b6c3d83c454f28d2c53df7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0faa3f9e5fb233d29d1e00390650febb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:a0faa3f9e5fb233d29d1e00390650febb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>.  <a href="#a0faa3f9e5fb233d29d1e00390650febb">More...</a><br /></td></tr>
-<tr class="separator:a0faa3f9e5fb233d29d1e00390650febb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a11f0fbc034fa81a4efedd73d61ce7568"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
-<tr class="memdesc:a11f0fbc034fa81a4efedd73d61ce7568"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory previously allocated using <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, or <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>.  <a href="#a11f0fbc034fa81a4efedd73d61ce7568">More...</a><br /></td></tr>
-<tr class="separator:a11f0fbc034fa81a4efedd73d61ce7568"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab9e709de044c5d8476bea77a4e755840"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, size_t allocationCount, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations)</td></tr>
-<tr class="memdesc:ab9e709de044c5d8476bea77a4e755840"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory and destroys multiple allocations.  <a href="#ab9e709de044c5d8476bea77a4e755840">More...</a><br /></td></tr>
-<tr class="separator:ab9e709de044c5d8476bea77a4e755840"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0ff488958ca72b28e545880463cb8696"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize newSize)</td></tr>
-<tr class="memdesc:a0ff488958ca72b28e545880463cb8696"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated.  <a href="#a0ff488958ca72b28e545880463cb8696">More...</a><br /></td></tr>
-<tr class="separator:a0ff488958ca72b28e545880463cb8696"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns current information about specified allocation and atomically marks it as used in current frame.  <a href="#a86dd08aba8633bfa4ad0df2e76481d8b">More...</a><br /></td></tr>
-<tr class="separator:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a43d8ba9673c846f049089a5029d5c73a"><td class="memItemLeft" align="right" valign="top">VkBool32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
-<tr class="memdesc:a43d8ba9673c846f049089a5029d5c73a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns <code>VK_TRUE</code> if allocation is not lost and atomically marks it as used in current frame.  <a href="#a43d8ba9673c846f049089a5029d5c73a">More...</a><br /></td></tr>
-<tr class="separator:a43d8ba9673c846f049089a5029d5c73a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af9147d31ffc11d62fc187bde283ed14f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void *pUserData)</td></tr>
-<tr class="memdesc:af9147d31ffc11d62fc187bde283ed14f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets pUserData in given allocation to new value.  <a href="#af9147d31ffc11d62fc187bde283ed14f">More...</a><br /></td></tr>
-<tr class="separator:af9147d31ffc11d62fc187bde283ed14f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae5c9657d9e94756269145b01c05d16f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation)</td></tr>
-<tr class="memdesc:ae5c9657d9e94756269145b01c05d16f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates new allocation that is in lost state from the beginning.  <a href="#ae5c9657d9e94756269145b01c05d16f1">More...</a><br /></td></tr>
-<tr class="separator:ae5c9657d9e94756269145b01c05d16f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad5bd1243512d099706de88168992f069"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void **ppData)</td></tr>
-<tr class="memdesc:ad5bd1243512d099706de88168992f069"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps memory represented by given allocation and returns pointer to it.  <a href="#ad5bd1243512d099706de88168992f069">More...</a><br /></td></tr>
-<tr class="separator:ad5bd1243512d099706de88168992f069"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9bc268595cb33f6ec4d519cfce81ff45"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
-<tr class="memdesc:a9bc268595cb33f6ec4d519cfce81ff45"><td class="mdescLeft">&#160;</td><td class="mdescRight">Unmaps memory represented by given allocation, mapped previously using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.  <a href="#a9bc268595cb33f6ec4d519cfce81ff45">More...</a><br /></td></tr>
-<tr class="separator:a9bc268595cb33f6ec4d519cfce81ff45"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abc34ee6f021f459aff885f3758c435de"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</td></tr>
-<tr class="memdesc:abc34ee6f021f459aff885f3758c435de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flushes memory of given allocation.  <a href="#abc34ee6f021f459aff885f3758c435de">More...</a><br /></td></tr>
-<tr class="separator:abc34ee6f021f459aff885f3758c435de"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0d0eb0c1102268fa9a476d12ecbe4006"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</td></tr>
-<tr class="memdesc:a0d0eb0c1102268fa9a476d12ecbe4006"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invalidates memory of given allocation.  <a href="#a0d0eb0c1102268fa9a476d12ecbe4006">More...</a><br /></td></tr>
-<tr class="separator:a0d0eb0c1102268fa9a476d12ecbe4006"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<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">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>
-<tr class="separator:a6b0929b914b60cf2d45cac4bf3547470"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a927c944f45e0f2941182abb6f608e64a"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</td></tr>
-<tr class="memdesc:a927c944f45e0f2941182abb6f608e64a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds buffer to allocation with additional parameters.  <a href="#a927c944f45e0f2941182abb6f608e64a">More...</a><br /></td></tr>
-<tr class="separator:a927c944f45e0f2941182abb6f608e64a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkImage image)</td></tr>
-<tr class="memdesc:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds image to allocation.  <a href="#a3d3ca45799923aa5d138e9e5f9eb2da5">More...</a><br /></td></tr>
-<tr class="separator:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa8251ee81b0045a443e35b8e8aa021bc"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</td></tr>
-<tr class="memdesc:aa8251ee81b0045a443e35b8e8aa021bc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds image to allocation with additional parameters.  <a href="#aa8251ee81b0045a443e35b8e8aa021bc">More...</a><br /></td></tr>
-<tr class="separator:aa8251ee81b0045a443e35b8e8aa021bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac72ee55598617e8eecca384e746bab51"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkBuffer *pBuffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="separator:ac72ee55598617e8eecca384e746bab51"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
-<tr class="memdesc:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan buffer and frees allocated memory.  <a href="#a0d9f4e4ba5bf9aab1f1c746387753d77">More...</a><br /></td></tr>
-<tr class="separator:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a02a94f25679275851a53e82eacbcfc73"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkImage *pImage, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:a02a94f25679275851a53e82eacbcfc73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>.  <a href="#a02a94f25679275851a53e82eacbcfc73">More...</a><br /></td></tr>
-<tr class="separator:a02a94f25679275851a53e82eacbcfc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
-<tr class="memdesc:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan image and frees allocated memory.  <a href="#ae50d2cb3b4a3bfd4dd40987234e50e7e">More...</a><br /></td></tr>
-<tr class="separator:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2bacace15ecc6886e4e4de5d1b77e4d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a> (const <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocator.html">VmaAllocator</a> *pAllocator)</td></tr>
+<tr class="memdesc:af2bacace15ecc6886e4e4de5d1b77e4d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates Allocator object.  <a href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">More...</a><br /></td></tr>
+<tr class="separator:af2bacace15ecc6886e4e4de5d1b77e4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a288d938ca902469760248ebd3633dde5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</td></tr>
+<tr class="memdesc:a288d938ca902469760248ebd3633dde5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys allocator object.  <a href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">More...</a><br /></td></tr>
+<tr class="separator:a288d938ca902469760248ebd3633dde5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a236c3299ad132eb753dbcbf6e309849e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vmaGetPhysicalDeviceProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</td></tr>
+<tr class="separator:a236c3299ad132eb753dbcbf6e309849e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada321efa19065e5a87f79dcbe11369a5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</td></tr>
+<tr class="separator:ada321efa19065e5a87f79dcbe11369a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0b03b51a0dff5dab25ac9c194fef3e1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</td></tr>
+<tr class="memdesc:ad0b03b51a0dff5dab25ac9c194fef3e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Given Memory Type Index, returns Property Flags of this memory type.  <a href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">More...</a><br /></td></tr>
+<tr class="separator:ad0b03b51a0dff5dab25ac9c194fef3e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a763d86a0fa9613d81b19dc724d418f67"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vmaSetCurrentFrameIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t frameIndex)</td></tr>
+<tr class="memdesc:a763d86a0fa9613d81b19dc724d418f67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets index of the current frame.  <a href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">More...</a><br /></td></tr>
+<tr class="separator:a763d86a0fa9613d81b19dc724d418f67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27abba9dd2d1ea2026f7f4dfb548638b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vmaCalculateStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_stats.html">VmaStats</a> *pStats)</td></tr>
+<tr class="memdesc:a27abba9dd2d1ea2026f7f4dfb548638b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from current state of the Allocator.  <a href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">More...</a><br /></td></tr>
+<tr class="separator:a27abba9dd2d1ea2026f7f4dfb548638b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d9ae6d97e48d85f5b6a685742d5f6f0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vmaGetBudget</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_budget.html">VmaBudget</a> *pBudget)</td></tr>
+<tr class="memdesc:a2d9ae6d97e48d85f5b6a685742d5f6f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves information about current memory budget for all memory heaps.  <a href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">More...</a><br /></td></tr>
+<tr class="separator:a2d9ae6d97e48d85f5b6a685742d5f6f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d7fc62aef0239d260e647447605aad4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vmaBuildStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char **ppStatsString, VkBool32 detailedMap)</td></tr>
+<tr class="memdesc:a4d7fc62aef0239d260e647447605aad4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Builds and returns statistics as string in JSON format.  <a href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">More...</a><br /></td></tr>
+<tr class="separator:a4d7fc62aef0239d260e647447605aad4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff001c5ec4ab2aeef3176804d6a865a9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char *pStatsString)</td></tr>
+<tr class="separator:aff001c5ec4ab2aeef3176804d6a865a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21530f0bd74d92b40cc1873e5037662c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memdesc:a21530f0bd74d92b40cc1873e5037662c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given memoryTypeBits and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">More...</a><br /></td></tr>
+<tr class="separator:a21530f0bd74d92b40cc1873e5037662c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a425905e868e4b487b5188f9d834dacbc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memdesc:a425905e868e4b487b5188f9d834dacbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkBufferCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">More...</a><br /></td></tr>
+<tr class="separator:a425905e868e4b487b5188f9d834dacbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a359c5187b7004880945f0e3debba91b9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vmaFindMemoryTypeIndexForImageInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memdesc:a359c5187b7004880945f0e3debba91b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkImageCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">More...</a><br /></td></tr>
+<tr class="separator:a359c5187b7004880945f0e3debba91b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee3406ab6b195cd85207ca2ef2d13a57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_pool.html">VmaPool</a> *pPool)</td></tr>
+<tr class="memdesc:aee3406ab6b195cd85207ca2ef2d13a57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates Vulkan device memory and creates <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object.  <a href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">More...</a><br /></td></tr>
+<tr class="separator:aee3406ab6b195cd85207ca2ef2d13a57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11693ab08f65761a142c466c5eceb849"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool)</td></tr>
+<tr class="memdesc:a11693ab08f65761a142c466c5eceb849"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object and frees Vulkan device memory.  <a href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">More...</a><br /></td></tr>
+<tr class="separator:a11693ab08f65761a142c466c5eceb849"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb343b27164d08d2b97e3b0c30ecdcbf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vmaGetPoolStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a> *pPoolStats)</td></tr>
+<tr class="memdesc:abb343b27164d08d2b97e3b0c30ecdcbf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a> object.  <a href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">More...</a><br /></td></tr>
+<tr class="separator:abb343b27164d08d2b97e3b0c30ecdcbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf235cb916f4c56feafdce45227fd17a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vmaMakePoolAllocationsLost</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, size_t *pLostAllocationCount)</td></tr>
+<tr class="memdesc:aaf235cb916f4c56feafdce45227fd17a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Marks all allocations in given pool as lost if they are not used in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> back from now.  <a href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">More...</a><br /></td></tr>
+<tr class="separator:aaf235cb916f4c56feafdce45227fd17a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bdc403637fe34c4dbb7f7de39357e02"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">vmaCheckPoolCorruption</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool)</td></tr>
+<tr class="memdesc:a6bdc403637fe34c4dbb7f7de39357e02"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks magic number in margins around all allocations in given memory pool in search for corruptions.  <a href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">More...</a><br /></td></tr>
+<tr class="separator:a6bdc403637fe34c4dbb7f7de39357e02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e40022ab443f88bfa8b13c2fcfd05cc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vmaAllocateMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:a6e40022ab443f88bfa8b13c2fcfd05cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">General purpose memory allocation.  <a href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">More...</a><br /></td></tr>
+<tr class="separator:a6e40022ab443f88bfa8b13c2fcfd05cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35b49cebb7d7c128db38d3949f54e325"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vmaAllocateMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, size_t allocationCount, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:a35b49cebb7d7c128db38d3949f54e325"><td class="mdescLeft">&#160;</td><td class="mdescRight">General purpose memory allocation for multiple allocation objects at once.  <a href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">More...</a><br /></td></tr>
+<tr class="separator:a35b49cebb7d7c128db38d3949f54e325"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af34f6d2ec25537ac0179ff614bae0012"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="separator:af34f6d2ec25537ac0179ff614bae0012"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25e3b30b93063b921d5078e538b1bf30"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vmaAllocateMemoryForImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:a25e3b30b93063b921d5078e538b1bf30"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>.  <a href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">More...</a><br /></td></tr>
+<tr class="separator:a25e3b30b93063b921d5078e538b1bf30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0438b3d982473eb1c93c77c7ab3212e1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a0438b3d982473eb1c93c77c7ab3212e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory previously allocated using <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>, or <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>.  <a href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">More...</a><br /></td></tr>
+<tr class="separator:a0438b3d982473eb1c93c77c7ab3212e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab00eabeaf43039298442591bcfba836"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vmaFreeMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, size_t allocationCount, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations)</td></tr>
+<tr class="memdesc:aab00eabeaf43039298442591bcfba836"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory and destroys multiple allocations.  <a href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">More...</a><br /></td></tr>
+<tr class="separator:aab00eabeaf43039298442591bcfba836"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36e0067f27609620651eefdf98ce624e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vmaResizeAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize newSize)</td></tr>
+<tr class="memdesc:a36e0067f27609620651eefdf98ce624e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated.  <a href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">More...</a><br /></td></tr>
+<tr class="separator:a36e0067f27609620651eefdf98ce624e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae10b53588f197141c6e88a1f5ec34789"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:ae10b53588f197141c6e88a1f5ec34789"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns current information about specified allocation and atomically marks it as used in current frame.  <a href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">More...</a><br /></td></tr>
+<tr class="separator:ae10b53588f197141c6e88a1f5ec34789"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05304fd2aa5736517feee653e1d579d1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkBool32 <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a05304fd2aa5736517feee653e1d579d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns <code>VK_TRUE</code> if allocation is not lost and atomically marks it as used in current frame.  <a href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">More...</a><br /></td></tr>
+<tr class="separator:a05304fd2aa5736517feee653e1d579d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a402558851f800ecd733800962c227f6a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vmaSetAllocationUserData</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void *pUserData)</td></tr>
+<tr class="memdesc:a402558851f800ecd733800962c227f6a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets pUserData in given allocation to new value.  <a href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">More...</a><br /></td></tr>
+<tr class="separator:a402558851f800ecd733800962c227f6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af70dc16d3b2818d514face3ed916f492"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vmaCreateLostAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation)</td></tr>
+<tr class="memdesc:af70dc16d3b2818d514face3ed916f492"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates new allocation that is in lost state from the beginning.  <a href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">More...</a><br /></td></tr>
+<tr class="separator:af70dc16d3b2818d514face3ed916f492"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae98119383e8e5754b6c09679386677d3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void **ppData)</td></tr>
+<tr class="memdesc:ae98119383e8e5754b6c09679386677d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps memory represented by given allocation and returns pointer to it.  <a href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">More...</a><br /></td></tr>
+<tr class="separator:ae98119383e8e5754b6c09679386677d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3128786cae5f317f51307074a487c278"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a3128786cae5f317f51307074a487c278"><td class="mdescLeft">&#160;</td><td class="mdescRight">Unmaps memory represented by given allocation, mapped previously using <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.  <a href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">More...</a><br /></td></tr>
+<tr class="separator:a3128786cae5f317f51307074a487c278"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca66f515fb5c3b370eaa9d826785c2c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">vmaFlushAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</td></tr>
+<tr class="memdesc:aca66f515fb5c3b370eaa9d826785c2c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flushes memory of given allocation.  <a href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">More...</a><br /></td></tr>
+<tr class="separator:aca66f515fb5c3b370eaa9d826785c2c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7489ab3d91f0011e2ed22f266f76966c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">vmaInvalidateAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</td></tr>
+<tr class="memdesc:a7489ab3d91f0011e2ed22f266f76966c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invalidates memory of given allocation.  <a href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">More...</a><br /></td></tr>
+<tr class="separator:a7489ab3d91f0011e2ed22f266f76966c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e53d9caa4368576cf351300b64ef8f4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vmaCheckCorruption</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</td></tr>
+<tr class="memdesc:a6e53d9caa4368576cf351300b64ef8f4"><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="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">More...</a><br /></td></tr>
+<tr class="separator:a6e53d9caa4368576cf351300b64ef8f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a696fc71963b7711cc0db3cc2225d0cd7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">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:a696fc71963b7711cc0db3cc2225d0cd7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Begins defragmentation process.  <a href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">More...</a><br /></td></tr>
+<tr class="separator:a696fc71963b7711cc0db3cc2225d0cd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e9d96ef2cbd8263cc523da91d1b40c9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">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:a5e9d96ef2cbd8263cc523da91d1b40c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Ends defragmentation process.  <a href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">More...</a><br /></td></tr>
+<tr class="separator:a5e9d96ef2cbd8263cc523da91d1b40c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c33b164a2597db181db3ca8e5812e4c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">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:a2c33b164a2597db181db3ca8e5812e4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated. Compacts memory by moving allocations.  <a href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">More...</a><br /></td></tr>
+<tr class="separator:a2c33b164a2597db181db3ca8e5812e4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a055cbf8d000a019a6270c66b46f0cb40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">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:a055cbf8d000a019a6270c66b46f0cb40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds buffer to allocation.  <a href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">More...</a><br /></td></tr>
+<tr class="separator:a055cbf8d000a019a6270c66b46f0cb40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa06d8fe2e969c048182e019f4b857ccf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vmaBindBufferMemory2</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</td></tr>
+<tr class="memdesc:aa06d8fe2e969c048182e019f4b857ccf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds buffer to allocation with additional parameters.  <a href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">More...</a><br /></td></tr>
+<tr class="separator:aa06d8fe2e969c048182e019f4b857ccf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9681b4996d0d33ad0bc811fc7394d272"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vmaBindImageMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkImage image)</td></tr>
+<tr class="memdesc:a9681b4996d0d33ad0bc811fc7394d272"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds image to allocation.  <a href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">More...</a><br /></td></tr>
+<tr class="separator:a9681b4996d0d33ad0bc811fc7394d272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82e760a2db3b517b965320ba71ebbfbb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vmaBindImageMemory2</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</td></tr>
+<tr class="memdesc:a82e760a2db3b517b965320ba71ebbfbb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds image to allocation with additional parameters.  <a href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">More...</a><br /></td></tr>
+<tr class="separator:a82e760a2db3b517b965320ba71ebbfbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafee10cbb01be73c643ed7e02c31003f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkBuffer *pBuffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="separator:aafee10cbb01be73c643ed7e02c31003f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3fa3daa743fcc950253f676aa8a323ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a3fa3daa743fcc950253f676aa8a323ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan buffer and frees allocated memory.  <a href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">More...</a><br /></td></tr>
+<tr class="separator:a3fa3daa743fcc950253f676aa8a323ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a001bd7a2077a42caf256a6fb2f2ba131"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkImage *pImage, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:a001bd7a2077a42caf256a6fb2f2ba131"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>.  <a href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">More...</a><br /></td></tr>
+<tr class="separator:a001bd7a2077a42caf256a6fb2f2ba131"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d7d34a7e2ef515a2734bdfdf7a76a9f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vmaDestroyImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a6d7d34a7e2ef515a2734bdfdf7a76a9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan image and frees allocated memory.  <a href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">More...</a><br /></td></tr>
+<tr class="separator:a6d7d34a7e2ef515a2734bdfdf7a76a9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Macro Definition Documentation</h2>
 <a id="a9f918755b601cf4bffca775992e6fb90"></a>
@@ -427,6 +448,34 @@
 
 </div>
 </div>
+<a id="aab7d949b3d77783f0ba704ae5e3136e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab7d949b3d77783f0ba704ae5e3136e0">&#9670;&nbsp;</a></span>VMA_CALL_POST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define VMA_CALL_POST</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3f0fa870030b4d421bf71e3928d5fe31"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f0fa870030b4d421bf71e3928d5fe31">&#9670;&nbsp;</a></span>VMA_CALL_PRE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define VMA_CALL_PRE</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <a id="af7b860e63b96d11e44ae8587ba06bbf4"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#af7b860e63b96d11e44ae8587ba06bbf4">&#9670;&nbsp;</a></span>VMA_DEDICATED_ALLOCATION</h2>
 
@@ -441,6 +490,20 @@
 
 </div>
 </div>
+<a id="a05decf1cf4ebf767beba7acca6c1ec3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05decf1cf4ebf767beba7acca6c1ec3a">&#9670;&nbsp;</a></span>VMA_MEMORY_BUDGET</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define VMA_MEMORY_BUDGET&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <a id="a1f0c126759fc96ccb6e2d23c101d770c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a1f0c126759fc96ccb6e2d23c101d770c">&#9670;&nbsp;</a></span>VMA_RECORDING_ENABLED</h2>
 
@@ -558,7 +621,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
+<p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
 
 </div>
 </div>
@@ -608,6 +671,22 @@
 
 </div>
 </div>
+<a id="ab79b48b6d25aada0de91a913896e1c38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab79b48b6d25aada0de91a913896e1c38">&#9670;&nbsp;</a></span>VmaBudget</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="struct_vma_budget.html">VmaBudget</a>  <a class="el" href="struct_vma_budget.html">VmaBudget</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Statistics of current memory usage and available budget, in bytes, for specific memory heap. </p>
+
+</div>
+</div>
 <a id="a96df0eddab2e1735782fe4e7cd05ea7f"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a96df0eddab2e1735782fe4e7cd05ea7f">&#9670;&nbsp;</a></span>VmaDefragmentationFlagBits</h2>
 
@@ -620,7 +699,7 @@
       </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>. None at the moment. Reserved for future use. </p>
+<p>Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use. </p>
 
 </div>
 </div>
@@ -650,8 +729,8 @@
       </table>
 </div><div class="memdoc">
 
-<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>
+<p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" 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#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl>
 
 </div>
 </div>
@@ -668,7 +747,7 @@
 </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>
+<p>To be used with function <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. </p>
 
 </div>
 </div>
@@ -684,7 +763,7 @@
       </table>
 </div><div class="memdoc">
 
-<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>
+<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p>
 
 </div>
 </div>
@@ -907,19 +986,21 @@
 <p>You should not use this flag together with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"></a>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT&#160;</td><td class="fielddoc"><p>Allocation created with this flag can become lost as a result of another allocation with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag, so you must check it before use.</p>
-<p>To check if allocation is not lost, call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and check if <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> is not <code>VK_NULL_HANDLE</code>.</p>
+<p>To check if allocation is not lost, call <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and check if <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> is not <code>VK_NULL_HANDLE</code>.</p>
 <p>For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page.</p>
 <p>You should not use this flag together with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"></a>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT&#160;</td><td class="fielddoc"><p>While creating allocation using this flag, other allocations that were created with flag <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> can become lost.</p>
 <p>For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"></a>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT&#160;</td><td class="fielddoc"><p>Set this flag to treat <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> as pointer to a null-terminated string. Instead of copying pointer value, a local copy of the string is made and stored in allocation's <code>pUserData</code>. The string is automatically freed together with the allocation. It is also used in <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. </p>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"></a>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT&#160;</td><td class="fielddoc"><p>Set this flag to treat <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> as pointer to a null-terminated string. Instead of copying pointer value, a local copy of the string is made and stored in allocation's <code>pUserData</code>. The string is automatically freed together with the allocation. It is also used in <a class="el" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"></a>VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT&#160;</td><td class="fielddoc"><p>Allocation will be created from upper stack in a double stack pool.</p>
 <p>This flag is only allowed for custom pools created with <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726" title="Enables alternative, linear allocation algorithm in this pool.">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> flag. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"></a>VMA_ALLOCATION_CREATE_DONT_BIND_BIT&#160;</td><td class="fielddoc"><p>Create both buffer/image and allocation, but don't bind them together. It is useful when you want to bind yourself to do some more advanced binding, e.g. using some extensions. The flag is meaningful only with functions that bind by default: <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>. Otherwise it is ignored. </p>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"></a>VMA_ALLOCATION_CREATE_DONT_BIND_BIT&#160;</td><td class="fielddoc"><p>Create both buffer/image and allocation, but don't bind them together. It is useful when you want to bind yourself to do some more advanced binding, e.g. using some extensions. The flag is meaningful only with functions that bind by default: <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>. Otherwise it is ignored. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"></a>VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT&#160;</td><td class="fielddoc"><p>Create allocation only if additional device memory required for it, if any, won't exceed memory budget. Otherwise return <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"></a>VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT&#160;</td><td class="fielddoc"><p>Allocation strategy that chooses smallest possible free range for the allocation. </p>
 </td></tr>
@@ -962,8 +1043,8 @@
 <p>Using this extenion will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p>
 <p>You may set this flag only if you found out that following device extensions are supported, you enabled them while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>, and you want them to be used internally by this library:</p>
 <ul>
-<li>VK_KHR_get_memory_requirements2</li>
-<li>VK_KHR_dedicated_allocation</li>
+<li>VK_KHR_get_memory_requirements2 (device extension)</li>
+<li>VK_KHR_dedicated_allocation (device extension)</li>
 </ul>
 <p>When this flag is set, you can experience following warnings reported by Vulkan validation layer. You can ignore them.</p>
 <blockquote class="doxtable">
@@ -972,7 +1053,11 @@
 </td></tr>
 <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"></a>VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT&#160;</td><td class="fielddoc"><p>Enables usage of VK_KHR_bind_memory2 extension.</p>
 <p>You may set this flag only if you found out that this device extension is supported, you enabled it while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>, and you want it to be used internally by this library.</p>
-<p>The extension provides functions <code>vkBindBufferMemory2KHR</code> and <code>vkBindImageMemory2KHR</code>, which allow to pass a chain of <code>pNext</code> structures while binding. This flag is required if you use <code>pNext</code> parameter in <a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a" title="Binds buffer to allocation with additional parameters.">vmaBindBufferMemory2()</a> or <a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc" title="Binds image to allocation with additional parameters.">vmaBindImageMemory2()</a>. </p>
+<p>The extension provides functions <code>vkBindBufferMemory2KHR</code> and <code>vkBindImageMemory2KHR</code>, which allow to pass a chain of <code>pNext</code> structures while binding. This flag is required if you use <code>pNext</code> parameter in <a class="el" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf" title="Binds buffer to allocation with additional parameters.">vmaBindBufferMemory2()</a> or <a class="el" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb" title="Binds image to allocation with additional parameters.">vmaBindImageMemory2()</a>. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"></a>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT&#160;</td><td class="fielddoc"><p>Enables usage of VK_EXT_memory_budget extension.</p>
+<p>You may set this flag only if you found out that this device extension is supported, you enabled it while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>, and you want it to be used internally by this library, along with another instance extension VK_KHR_get_physical_device_properties2, which is required by it.</p>
+<p>The extension provides query for current memory usage and budget, which will probably be more accurate than an estimation used by the library otherwise. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"></a>VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
 </table>
@@ -991,7 +1076,7 @@
       </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>. None at the moment. Reserved for future use. </p>
+<p>Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use. </p>
 <table class="fieldtable">
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"></a>VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
 </table>
@@ -1054,8 +1139,8 @@
 <table class="fieldtable">
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"></a>VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT&#160;</td><td class="fielddoc"><p>Use this flag if you always allocate only buffers and linear images or only optimal images out of this pool and so Buffer-Image Granularity can be ignored. </p>
 <p>This is an optional optimization flag.</p>
-<p>If you always allocate using <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>, <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, then you don't need to use it because allocator knows exact type of your allocations so it can handle Buffer-Image Granularity in the optimal way.</p>
-<p>If you also allocate using <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a> or <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a>, exact type of such allocations is not known, so allocator must be conservative in handling Buffer-Image Granularity, which can lead to suboptimal allocation (wasted memory). In that case, if you can make sure you always allocate only buffers and linear images or only optimal images out of this pool, use this flag to make allocator disregard Buffer-Image Granularity and so make allocations faster and more optimal. </p>
+<p>If you always allocate using <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>, <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>, then you don't need to use it because allocator knows exact type of your allocations so it can handle Buffer-Image Granularity in the optimal way.</p>
+<p>If you also allocate using <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a> or <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a>, exact type of such allocations is not known, so allocator must be conservative in handling Buffer-Image Granularity, which can lead to suboptimal allocation (wasted memory). In that case, if you can make sure you always allocate only buffers and linear images or only optimal images out of this pool, use this flag to make allocator disregard Buffer-Image Granularity and so make allocations faster and more optimal. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"></a>VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT&#160;</td><td class="fielddoc"><p>Enables alternative, linear allocation algorithm in this pool. </p>
 <p>Specify this flag to enable linear allocation algorithm, which always creates new allocations after last one and doesn't reuse space from allocations freed in between. It trades memory consumption for simplified algorithm and data structure, which has better performance and uses less memory for metadata.</p>
@@ -1097,14 +1182,14 @@
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
-<a id="abf28077dbf82d0908b8acbe8ee8dd9b8"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#abf28077dbf82d0908b8acbe8ee8dd9b8">&#9670;&nbsp;</a></span>vmaAllocateMemory()</h2>
+<a id="a6e40022ab443f88bfa8b13c2fcfd05cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e40022ab443f88bfa8b13c2fcfd05cc">&#9670;&nbsp;</a></span>vmaAllocateMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaAllocateMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaAllocateMemory </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>
@@ -1145,23 +1230,23 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Handle to allocated memory. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
-<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840" title="Frees memory and destroys multiple allocations.">vmaFreeMemoryPages()</a>.</p>
-<p>It is recommended to use <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>, <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> instead whenever possible. </p>
+<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836" title="Frees memory and destroys multiple allocations.">vmaFreeMemoryPages()</a>.</p>
+<p>It is recommended to use <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>, <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a> instead whenever possible. </p>
 
 </div>
 </div>
-<a id="a7fdf64415b6c3d83c454f28d2c53df7b"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a7fdf64415b6c3d83c454f28d2c53df7b">&#9670;&nbsp;</a></span>vmaAllocateMemoryForBuffer()</h2>
+<a id="af34f6d2ec25537ac0179ff614bae0012"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af34f6d2ec25537ac0179ff614bae0012">&#9670;&nbsp;</a></span>vmaAllocateMemoryForBuffer()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaAllocateMemoryForBuffer </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaAllocateMemoryForBuffer </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>
@@ -1200,22 +1285,22 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Handle to allocated memory. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
-<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>. </p>
+<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>. </p>
 
 </div>
 </div>
-<a id="a0faa3f9e5fb233d29d1e00390650febb"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a0faa3f9e5fb233d29d1e00390650febb">&#9670;&nbsp;</a></span>vmaAllocateMemoryForImage()</h2>
+<a id="a25e3b30b93063b921d5078e538b1bf30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25e3b30b93063b921d5078e538b1bf30">&#9670;&nbsp;</a></span>vmaAllocateMemoryForImage()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaAllocateMemoryForImage </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaAllocateMemoryForImage </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>
@@ -1252,18 +1337,18 @@
       </table>
 </div><div class="memdoc">
 
-<p>Function similar to <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>. </p>
+<p>Function similar to <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>. </p>
 
 </div>
 </div>
-<a id="ad37e82e492b3de38fc3f4cffd9ad0ae1"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ad37e82e492b3de38fc3f4cffd9ad0ae1">&#9670;&nbsp;</a></span>vmaAllocateMemoryPages()</h2>
+<a id="a35b49cebb7d7c128db38d3949f54e325"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35b49cebb7d7c128db38d3949f54e325">&#9670;&nbsp;</a></span>vmaAllocateMemoryPages()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaAllocateMemoryPages </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaAllocateMemoryPages </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>
@@ -1318,20 +1403,20 @@
   </table>
   </dd>
 </dl>
-<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840" title="Frees memory and destroys multiple allocations.">vmaFreeMemoryPages()</a>.</p>
-<p>Word "pages" is just a suggestion to use this function to allocate pieces of memory needed for sparse binding. It is just a general purpose allocation function able to make multiple allocations at once. It may be internally optimized to be more efficient than calling <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a> <code>allocationCount</code> times.</p>
+<p>You should free the memory using <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> or <a class="el" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836" title="Frees memory and destroys multiple allocations.">vmaFreeMemoryPages()</a>.</p>
+<p>Word "pages" is just a suggestion to use this function to allocate pieces of memory needed for sparse binding. It is just a general purpose allocation function able to make multiple allocations at once. It may be internally optimized to be more efficient than calling <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a> <code>allocationCount</code> times.</p>
 <p>All allocations are made using same parameters. All of them are created out of the same memory pool and type. If any allocation fails, all allocations already made within this function call are also freed, so that when returned result is not <code>VK_SUCCESS</code>, <code>pAllocation</code> array is always entirely filled with <code>VK_NULL_HANDLE</code>. </p>
 
 </div>
 </div>
-<a id="a6b0929b914b60cf2d45cac4bf3547470"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a6b0929b914b60cf2d45cac4bf3547470">&#9670;&nbsp;</a></span>vmaBindBufferMemory()</h2>
+<a id="a055cbf8d000a019a6270c66b46f0cb40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a055cbf8d000a019a6270c66b46f0cb40">&#9670;&nbsp;</a></span>vmaBindBufferMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaBindBufferMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaBindBufferMemory </td>
           <td>(</td>
           <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
@@ -1358,18 +1443,18 @@
 
 <p>Binds buffer to allocation. </p>
 <p>Binds specified buffer to region of memory represented by specified allocation. Gets <code>VkDeviceMemory</code> handle and offset from the allocation. If you want to create a buffer, allocate memory for it and bind them together separately, you should use this function for binding instead of standard <code>vkBindBufferMemory()</code>, because it ensures proper synchronization so that when a <code>VkDeviceMemory</code> object is used by multiple allocations, calls to <code>vkBind*Memory()</code> or <code>vkMapMemory()</code> won't happen from multiple threads simultaneously (which is illegal in Vulkan).</p>
-<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> instead of this one. </p>
+<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a> instead of this one. </p>
 
 </div>
 </div>
-<a id="a927c944f45e0f2941182abb6f608e64a"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a927c944f45e0f2941182abb6f608e64a">&#9670;&nbsp;</a></span>vmaBindBufferMemory2()</h2>
+<a id="aa06d8fe2e969c048182e019f4b857ccf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa06d8fe2e969c048182e019f4b857ccf">&#9670;&nbsp;</a></span>vmaBindBufferMemory2()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaBindBufferMemory2 </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaBindBufferMemory2 </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>
@@ -1414,19 +1499,19 @@
   </table>
   </dd>
 </dl>
-<p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, but it provides additional parameters.</p>
+<p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, but it provides additional parameters.</p>
 <p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag. Otherwise the call fails. </p>
 
 </div>
 </div>
-<a id="a3d3ca45799923aa5d138e9e5f9eb2da5"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a3d3ca45799923aa5d138e9e5f9eb2da5">&#9670;&nbsp;</a></span>vmaBindImageMemory()</h2>
+<a id="a9681b4996d0d33ad0bc811fc7394d272"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9681b4996d0d33ad0bc811fc7394d272">&#9670;&nbsp;</a></span>vmaBindImageMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaBindImageMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaBindImageMemory </td>
           <td>(</td>
           <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
@@ -1453,18 +1538,18 @@
 
 <p>Binds image to allocation. </p>
 <p>Binds specified image to region of memory represented by specified allocation. Gets <code>VkDeviceMemory</code> handle and offset from the allocation. If you want to create an image, allocate memory for it and bind them together separately, you should use this function for binding instead of standard <code>vkBindImageMemory()</code>, because it ensures proper synchronization so that when a <code>VkDeviceMemory</code> object is used by multiple allocations, calls to <code>vkBind*Memory()</code> or <code>vkMapMemory()</code> won't happen from multiple threads simultaneously (which is illegal in Vulkan).</p>
-<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a> instead of this one. </p>
+<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a> instead of this one. </p>
 
 </div>
 </div>
-<a id="aa8251ee81b0045a443e35b8e8aa021bc"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aa8251ee81b0045a443e35b8e8aa021bc">&#9670;&nbsp;</a></span>vmaBindImageMemory2()</h2>
+<a id="a82e760a2db3b517b965320ba71ebbfbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a82e760a2db3b517b965320ba71ebbfbb">&#9670;&nbsp;</a></span>vmaBindImageMemory2()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaBindImageMemory2 </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaBindImageMemory2 </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>
@@ -1509,19 +1594,19 @@
   </table>
   </dd>
 </dl>
-<p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5" title="Binds image to allocation.">vmaBindImageMemory()</a>, but it provides additional parameters.</p>
+<p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272" title="Binds image to allocation.">vmaBindImageMemory()</a>, but it provides additional parameters.</p>
 <p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag. Otherwise the call fails. </p>
 
 </div>
 </div>
-<a id="aa4fee7eb5253377599ef4fd38c93c2a0"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aa4fee7eb5253377599ef4fd38c93c2a0">&#9670;&nbsp;</a></span>vmaBuildStatsString()</h2>
+<a id="a4d7fc62aef0239d260e647447605aad4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d7fc62aef0239d260e647447605aad4">&#9670;&nbsp;</a></span>vmaBuildStatsString()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaBuildStatsString </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaBuildStatsString </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>
@@ -1549,21 +1634,21 @@
 <p>Builds and returns statistics as string in JSON format. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramdir">[out]</td><td class="paramname">ppStatsString</td><td>Must be freed using <a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString()</a> function. </td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">ppStatsString</td><td>Must be freed using <a class="el" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString()</a> function. </td></tr>
   </table>
   </dd>
 </dl>
 
 </div>
 </div>
-<a id="a333b61c1788cb23559177531e6a93ca3"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a333b61c1788cb23559177531e6a93ca3">&#9670;&nbsp;</a></span>vmaCalculateStats()</h2>
+<a id="a27abba9dd2d1ea2026f7f4dfb548638b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27abba9dd2d1ea2026f7f4dfb548638b">&#9670;&nbsp;</a></span>vmaCalculateStats()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaCalculateStats </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCalculateStats </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>
@@ -1583,17 +1668,19 @@
 </div><div class="memdoc">
 
 <p>Retrieves statistics from current state of the Allocator. </p>
+<p>This function is called "calculate" not "get" because it has to traverse all internal data structures, so it may be quite slow. For faster but more brief statistics suitable to be called every frame or every allocation, use <a class="el" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0" title="Retrieves information about current memory budget for all memory heaps.">vmaGetBudget()</a>.</p>
+<p>Note that when using allocator from multiple threads, returned information may immediately become outdated. </p>
 
 </div>
 </div>
-<a id="a49329a7f030dafcf82f7b73334c22e98"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a49329a7f030dafcf82f7b73334c22e98">&#9670;&nbsp;</a></span>vmaCheckCorruption()</h2>
+<a id="a6e53d9caa4368576cf351300b64ef8f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e53d9caa4368576cf351300b64ef8f4">&#9670;&nbsp;</a></span>vmaCheckCorruption()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCheckCorruption </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCheckCorruption </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>
@@ -1630,14 +1717,14 @@
 
 </div>
 </div>
-<a id="ad535935619c7a549bf837e1bb0068f89"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ad535935619c7a549bf837e1bb0068f89">&#9670;&nbsp;</a></span>vmaCheckPoolCorruption()</h2>
+<a id="a6bdc403637fe34c4dbb7f7de39357e02"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bdc403637fe34c4dbb7f7de39357e02">&#9670;&nbsp;</a></span>vmaCheckPoolCorruption()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCheckPoolCorruption </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCheckPoolCorruption </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>
@@ -1668,14 +1755,14 @@
 
 </div>
 </div>
-<a id="a200692051ddb34240248234f5f4c17bb"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a200692051ddb34240248234f5f4c17bb">&#9670;&nbsp;</a></span>vmaCreateAllocator()</h2>
+<a id="af2bacace15ecc6886e4e4de5d1b77e4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2bacace15ecc6886e4e4de5d1b77e4d">&#9670;&nbsp;</a></span>vmaCreateAllocator()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCreateAllocator </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCreateAllocator </td>
           <td>(</td>
           <td class="paramtype">const <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> *&#160;</td>
           <td class="paramname"><em>pCreateInfo</em>, </td>
@@ -1698,14 +1785,14 @@
 
 </div>
 </div>
-<a id="ac72ee55598617e8eecca384e746bab51"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac72ee55598617e8eecca384e746bab51">&#9670;&nbsp;</a></span>vmaCreateBuffer()</h2>
+<a id="aafee10cbb01be73c643ed7e02c31003f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aafee10cbb01be73c643ed7e02c31003f">&#9670;&nbsp;</a></span>vmaCreateBuffer()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCreateBuffer </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCreateBuffer </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>
@@ -1751,7 +1838,7 @@
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pBuffer</td><td>Buffer that was created. </td></tr>
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Allocation that was created. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
@@ -1762,19 +1849,19 @@
 <li>Binds the buffer with the memory.</li>
 </ol>
 <p>If any of these operations fail, buffer and allocation are not created, returned value is negative error code, *pBuffer and *pAllocation are null.</p>
-<p>If the function succeeded, you must destroy both buffer and allocation when you no longer need them using either convenience function <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a> or separately, using <code>vkDestroyBuffer()</code> and <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p>
+<p>If the function succeeded, you must destroy both buffer and allocation when you no longer need them using either convenience function <a class="el" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a> or separately, using <code>vkDestroyBuffer()</code> and <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p>
 <p>If VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used, VK_KHR_dedicated_allocation extension is used internally to query driver whether it requires or prefers the new buffer to have dedicated allocation. If yes, and if dedicated allocation is possible (<a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> is null and VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated allocation for this buffer, just like when using VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT. </p>
 
 </div>
 </div>
-<a id="a02a94f25679275851a53e82eacbcfc73"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a02a94f25679275851a53e82eacbcfc73">&#9670;&nbsp;</a></span>vmaCreateImage()</h2>
+<a id="a001bd7a2077a42caf256a6fb2f2ba131"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a001bd7a2077a42caf256a6fb2f2ba131">&#9670;&nbsp;</a></span>vmaCreateImage()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCreateImage </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCreateImage </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>
@@ -1817,18 +1904,18 @@
       </table>
 </div><div class="memdoc">
 
-<p>Function similar to <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>. </p>
+<p>Function similar to <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>. </p>
 
 </div>
 </div>
-<a id="ae5c9657d9e94756269145b01c05d16f1"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ae5c9657d9e94756269145b01c05d16f1">&#9670;&nbsp;</a></span>vmaCreateLostAllocation()</h2>
+<a id="af70dc16d3b2818d514face3ed916f492"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af70dc16d3b2818d514face3ed916f492">&#9670;&nbsp;</a></span>vmaCreateLostAllocation()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaCreateLostAllocation </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCreateLostAllocation </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>
@@ -1849,19 +1936,19 @@
 
 <p>Creates new allocation that is in lost state from the beginning. </p>
 <p>It can be useful if you need a dummy, non-null allocation.</p>
-<p>You still need to destroy created object using <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p>
+<p>You still need to destroy created object using <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p>
 <p>Returned allocation is not tied to any specific memory pool or memory type and not bound to any image or buffer. It has size = 0. It cannot be turned into a real, non-empty allocation. </p>
 
 </div>
 </div>
-<a id="a5c8770ded7c59c8caac6de0c2cb00b50"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a5c8770ded7c59c8caac6de0c2cb00b50">&#9670;&nbsp;</a></span>vmaCreatePool()</h2>
+<a id="aee3406ab6b195cd85207ca2ef2d13a57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee3406ab6b195cd85207ca2ef2d13a57">&#9670;&nbsp;</a></span>vmaCreatePool()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaCreatePool </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaCreatePool </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>
@@ -1898,14 +1985,14 @@
 
 </div>
 </div>
-<a id="a6aced90fcc7b39882b6654a740a0b9bb"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a6aced90fcc7b39882b6654a740a0b9bb">&#9670;&nbsp;</a></span>vmaDefragment()</h2>
+<a id="a2c33b164a2597db181db3ca8e5812e4c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c33b164a2597db181db3ca8e5812e4c">&#9670;&nbsp;</a></span>vmaDefragment()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaDefragment </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaDefragment </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>
@@ -1960,7 +2047,7 @@
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd><code>VK_SUCCESS</code> if completed, 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>
+<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#a696fc71963b7711cc0db3cc2225d0cd7" 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>
@@ -1975,14 +2062,14 @@
 
 </div>
 </div>
-<a id="a36ba776fd7fd5cb1e9359fdc0d8e6e8a"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">&#9670;&nbsp;</a></span>vmaDefragmentationBegin()</h2>
+<a id="a696fc71963b7711cc0db3cc2225d0cd7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a696fc71963b7711cc0db3cc2225d0cd7">&#9670;&nbsp;</a></span>vmaDefragmentationBegin()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaDefragmentationBegin </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> 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>
@@ -2019,31 +2106,31 @@
     <tr><td class="paramdir"></td><td class="paramname">allocator</td><td>Allocator object. </td></tr>
     <tr><td class="paramdir"></td><td class="paramname">pInfo</td><td>Structure filled with parameters of defragmentation. </td></tr>
     <tr><td class="paramdir">[out]</td><td class="paramname">pStats</td><td>Optional. Statistics of defragmentation. You can pass null if you are not interested in this information. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pContext</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>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pContext</td><td>Context object that must be passed to <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" 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>Warning! 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>
+<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#a5e9d96ef2cbd8263cc523da91d1b40c9" 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#a2c33b164a2597db181db3ca8e5812e4c" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>.</p>
+<p>Warning! Between the call to <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> and <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>:</p>
 <ul>
-<li>You should not use any of allocations passed as <code>pInfo-&gt;pAllocations</code> or any allocations that belong to pools passed as <code>pInfo-&gt;pPools</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 access their data.</li>
+<li>You should not use any of allocations passed as <code>pInfo-&gt;pAllocations</code> or any allocations that belong to pools passed as <code>pInfo-&gt;pPools</code>, including calling <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" 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#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>, or access 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, 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 in different pools.</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</code> is not null, 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>
+<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#a5e9d96ef2cbd8263cc523da91d1b40c9" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>.</li>
+<li>If <code>pInfo-&gt;commandBuffer</code> is not null, you must submit that command buffer and make sure it finished execution before calling <a class="el" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>.</li>
 </ul>
 <p>For more information and important limitations regarding defragmentation, see documentation chapter: <a class="el" href="defragmentation.html">Defragmentation</a>. </p>
 
 </div>
 </div>
-<a id="a8774e20e91e245aae959ba63efa15dd2"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a8774e20e91e245aae959ba63efa15dd2">&#9670;&nbsp;</a></span>vmaDefragmentationEnd()</h2>
+<a id="a5e9d96ef2cbd8263cc523da91d1b40c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5e9d96ef2cbd8263cc523da91d1b40c9">&#9670;&nbsp;</a></span>vmaDefragmentationEnd()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaDefragmentationEnd </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> 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>
@@ -2063,18 +2150,18 @@
 </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>
+<p>Use this function to finish defragmentation started by <a class="el" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7" 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>
+<a id="a288d938ca902469760248ebd3633dde5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a288d938ca902469760248ebd3633dde5">&#9670;&nbsp;</a></span>vmaDestroyAllocator()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaDestroyAllocator </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaDestroyAllocator </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><td>)</td>
@@ -2087,14 +2174,14 @@
 
 </div>
 </div>
-<a id="a0d9f4e4ba5bf9aab1f1c746387753d77"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a0d9f4e4ba5bf9aab1f1c746387753d77">&#9670;&nbsp;</a></span>vmaDestroyBuffer()</h2>
+<a id="a3fa3daa743fcc950253f676aa8a323ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3fa3daa743fcc950253f676aa8a323ea">&#9670;&nbsp;</a></span>vmaDestroyBuffer()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaDestroyBuffer </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaDestroyBuffer </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>
@@ -2121,18 +2208,20 @@
 
 <p>Destroys Vulkan buffer and frees allocated memory. </p>
 <p>This is just a convenience function equivalent to:</p>
-<div class="fragment"><div class="line">vkDestroyBuffer(device, buffer, allocationCallbacks);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(allocator, allocation);</div></div><!-- fragment --><p>It it safe to pass null as buffer and/or allocation. </p>
+<div class="fragment"><div class="line">vkDestroyBuffer(device, buffer, allocationCallbacks);</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a>(allocator, allocation);</div>
+</div><!-- fragment --><p>It it safe to pass null as buffer and/or allocation. </p>
 
 </div>
 </div>
-<a id="ae50d2cb3b4a3bfd4dd40987234e50e7e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ae50d2cb3b4a3bfd4dd40987234e50e7e">&#9670;&nbsp;</a></span>vmaDestroyImage()</h2>
+<a id="a6d7d34a7e2ef515a2734bdfdf7a76a9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d7d34a7e2ef515a2734bdfdf7a76a9f">&#9670;&nbsp;</a></span>vmaDestroyImage()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaDestroyImage </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaDestroyImage </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>
@@ -2159,18 +2248,20 @@
 
 <p>Destroys Vulkan image and frees allocated memory. </p>
 <p>This is just a convenience function equivalent to:</p>
-<div class="fragment"><div class="line">vkDestroyImage(device, image, allocationCallbacks);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(allocator, allocation);</div></div><!-- fragment --><p>It it safe to pass null as image and/or allocation. </p>
+<div class="fragment"><div class="line">vkDestroyImage(device, image, allocationCallbacks);</div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a>(allocator, allocation);</div>
+</div><!-- fragment --><p>It it safe to pass null as image and/or allocation. </p>
 
 </div>
 </div>
-<a id="a5485779c8f1948238fc4e92232fa65e1"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a5485779c8f1948238fc4e92232fa65e1">&#9670;&nbsp;</a></span>vmaDestroyPool()</h2>
+<a id="a11693ab08f65761a142c466c5eceb849"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11693ab08f65761a142c466c5eceb849">&#9670;&nbsp;</a></span>vmaDestroyPool()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaDestroyPool </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaDestroyPool </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>
@@ -2193,14 +2284,14 @@
 
 </div>
 </div>
-<a id="aef15a94b58fbcb0fe706d5720e84a74a"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aef15a94b58fbcb0fe706d5720e84a74a">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndex()</h2>
+<a id="a21530f0bd74d92b40cc1873e5037662c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21530f0bd74d92b40cc1873e5037662c">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndex()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaFindMemoryTypeIndex </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFindMemoryTypeIndex </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>
@@ -2243,14 +2334,14 @@
 
 </div>
 </div>
-<a id="ae790ab9ffaf7667fb8f62523e6897888"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ae790ab9ffaf7667fb8f62523e6897888">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndexForBufferInfo()</h2>
+<a id="a425905e868e4b487b5188f9d834dacbc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a425905e868e4b487b5188f9d834dacbc">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndexForBufferInfo()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaFindMemoryTypeIndexForBufferInfo </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFindMemoryTypeIndexForBufferInfo </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>
@@ -2292,14 +2383,14 @@
 
 </div>
 </div>
-<a id="a088da83d8eaf3ce9056d9ea0b981d472"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a088da83d8eaf3ce9056d9ea0b981d472">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndexForImageInfo()</h2>
+<a id="a359c5187b7004880945f0e3debba91b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a359c5187b7004880945f0e3debba91b9">&#9670;&nbsp;</a></span>vmaFindMemoryTypeIndexForImageInfo()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaFindMemoryTypeIndexForImageInfo </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFindMemoryTypeIndexForImageInfo </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>
@@ -2341,14 +2432,14 @@
 
 </div>
 </div>
-<a id="abc34ee6f021f459aff885f3758c435de"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#abc34ee6f021f459aff885f3758c435de">&#9670;&nbsp;</a></span>vmaFlushAllocation()</h2>
+<a id="aca66f515fb5c3b370eaa9d826785c2c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca66f515fb5c3b370eaa9d826785c2c6">&#9670;&nbsp;</a></span>vmaFlushAllocation()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaFlushAllocation </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFlushAllocation </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>
@@ -2392,14 +2483,14 @@
 
 </div>
 </div>
-<a id="a11f0fbc034fa81a4efedd73d61ce7568"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a11f0fbc034fa81a4efedd73d61ce7568">&#9670;&nbsp;</a></span>vmaFreeMemory()</h2>
+<a id="a0438b3d982473eb1c93c77c7ab3212e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0438b3d982473eb1c93c77c7ab3212e1">&#9670;&nbsp;</a></span>vmaFreeMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaFreeMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFreeMemory </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>
@@ -2418,19 +2509,19 @@
       </table>
 </div><div class="memdoc">
 
-<p>Frees memory previously allocated using <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, or <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>. </p>
+<p>Frees memory previously allocated using <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer()</a>, or <a class="el" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30" title="Function similar to vmaAllocateMemoryForBuffer().">vmaAllocateMemoryForImage()</a>. </p>
 <p>Passing <code>VK_NULL_HANDLE</code> as <code>allocation</code> is valid. Such function call is just skipped. </p>
 
 </div>
 </div>
-<a id="ab9e709de044c5d8476bea77a4e755840"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab9e709de044c5d8476bea77a4e755840">&#9670;&nbsp;</a></span>vmaFreeMemoryPages()</h2>
+<a id="aab00eabeaf43039298442591bcfba836"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab00eabeaf43039298442591bcfba836">&#9670;&nbsp;</a></span>vmaFreeMemoryPages()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaFreeMemoryPages </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFreeMemoryPages </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>
@@ -2456,19 +2547,19 @@
 </div><div class="memdoc">
 
 <p>Frees memory and destroys multiple allocations. </p>
-<p>Word "pages" is just a suggestion to use this function to free pieces of memory used for sparse binding. It is just a general purpose function to free memory and destroy allocations made using e.g. <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1" title="General purpose memory allocation for multiple allocation objects at once.">vmaAllocateMemoryPages()</a> and other functions. It may be internally optimized to be more efficient than calling <a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> <code>allocationCount</code> times.</p>
+<p>Word "pages" is just a suggestion to use this function to free pieces of memory used for sparse binding. It is just a general purpose function to free memory and destroy allocations made using e.g. <a class="el" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc" title="General purpose memory allocation.">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325" title="General purpose memory allocation for multiple allocation objects at once.">vmaAllocateMemoryPages()</a> and other functions. It may be internally optimized to be more efficient than calling <a class="el" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a> <code>allocationCount</code> times.</p>
 <p>Allocations in <code>pAllocations</code> array can come from any memory pools and types. Passing <code>VK_NULL_HANDLE</code> as elements of <code>pAllocations</code> array is valid. Such entries are just skipped. </p>
 
 </div>
 </div>
-<a id="a3104eb30d8122c84dd8541063f145288"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a3104eb30d8122c84dd8541063f145288">&#9670;&nbsp;</a></span>vmaFreeStatsString()</h2>
+<a id="aff001c5ec4ab2aeef3176804d6a865a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff001c5ec4ab2aeef3176804d6a865a9">&#9670;&nbsp;</a></span>vmaFreeStatsString()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaFreeStatsString </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaFreeStatsString </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>
@@ -2489,14 +2580,14 @@
 
 </div>
 </div>
-<a id="a86dd08aba8633bfa4ad0df2e76481d8b"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a86dd08aba8633bfa4ad0df2e76481d8b">&#9670;&nbsp;</a></span>vmaGetAllocationInfo()</h2>
+<a id="ae10b53588f197141c6e88a1f5ec34789"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae10b53588f197141c6e88a1f5ec34789">&#9670;&nbsp;</a></span>vmaGetAllocationInfo()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaGetAllocationInfo </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetAllocationInfo </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>
@@ -2523,23 +2614,61 @@
 
 <p>Returns current information about specified allocation and atomically marks it as used in current frame. </p>
 <p>Current paramters of given allocation are returned in <code>pAllocationInfo</code>.</p>
-<p>This function also atomically "touches" allocation - marks it as used in current frame, just like <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>. If the allocation is in lost state, <code>pAllocationInfo-&gt;deviceMemory == VK_NULL_HANDLE</code>.</p>
+<p>This function also atomically "touches" allocation - marks it as used in current frame, just like <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>. If the allocation is in lost state, <code>pAllocationInfo-&gt;deviceMemory == VK_NULL_HANDLE</code>.</p>
 <p>Although this function uses atomics and doesn't lock any mutex, so it should be quite efficient, you can avoid calling it too often.</p>
 <ul>
-<li>You can retrieve same <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a> structure while creating your resource, from function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>. You can remember it if you are sure parameters don't change (e.g. due to defragmentation or allocation becoming lost).</li>
-<li>If you just want to check if allocation is not lost, <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> will work faster. </li>
+<li>You can retrieve same <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a> structure while creating your resource, from function <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>. You can remember it if you are sure parameters don't change (e.g. due to defragmentation or allocation becoming lost).</li>
+<li>If you just want to check if allocation is not lost, <a class="el" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> will work faster. </li>
 </ul>
 
 </div>
 </div>
-<a id="ab88db292a17974f911182543fda52d19"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab88db292a17974f911182543fda52d19">&#9670;&nbsp;</a></span>vmaGetMemoryProperties()</h2>
+<a id="a2d9ae6d97e48d85f5b6a685742d5f6f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2d9ae6d97e48d85f5b6a685742d5f6f0">&#9670;&nbsp;</a></span>vmaGetBudget()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaGetMemoryProperties </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetBudget </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_budget.html">VmaBudget</a> *&#160;</td>
+          <td class="paramname"><em>pBudget</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves information about current memory budget for all memory heaps. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[out]</td><td class="paramname">pBudget</td><td>Must point to array with number of elements at least equal to number of memory heaps in physical device used.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>This function is called "get" not "calculate" because it is very fast, suitable to be called every frame or every allocation. For more detailed statistics use <a class="el" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b" title="Retrieves statistics from current state of the Allocator.">vmaCalculateStats()</a>.</p>
+<p>Note that when using allocator from multiple threads, returned information may immediately become outdated. </p>
+
+</div>
+</div>
+<a id="ada321efa19065e5a87f79dcbe11369a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada321efa19065e5a87f79dcbe11369a5">&#9670;&nbsp;</a></span>vmaGetMemoryProperties()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetMemoryProperties </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>
@@ -2561,14 +2690,14 @@
 
 </div>
 </div>
-<a id="a8701444752eb5de4464adb5a2b514bca"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a8701444752eb5de4464adb5a2b514bca">&#9670;&nbsp;</a></span>vmaGetMemoryTypeProperties()</h2>
+<a id="ad0b03b51a0dff5dab25ac9c194fef3e1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0b03b51a0dff5dab25ac9c194fef3e1">&#9670;&nbsp;</a></span>vmaGetMemoryTypeProperties()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaGetMemoryTypeProperties </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetMemoryTypeProperties </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>
@@ -2594,18 +2723,18 @@
 </div><div class="memdoc">
 
 <p>Given Memory Type Index, returns Property Flags of this memory type. </p>
-<p>This is just a convenience function. Same information can be obtained using <a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties()</a>. </p>
+<p>This is just a convenience function. Same information can be obtained using <a class="el" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties()</a>. </p>
 
 </div>
 </div>
-<a id="aecabf7b6e91ea87d0316fa0a9e014fe0"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aecabf7b6e91ea87d0316fa0a9e014fe0">&#9670;&nbsp;</a></span>vmaGetPhysicalDeviceProperties()</h2>
+<a id="a236c3299ad132eb753dbcbf6e309849e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a236c3299ad132eb753dbcbf6e309849e">&#9670;&nbsp;</a></span>vmaGetPhysicalDeviceProperties()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaGetPhysicalDeviceProperties </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetPhysicalDeviceProperties </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>
@@ -2627,14 +2756,14 @@
 
 </div>
 </div>
-<a id="ae8bf76997b234ef68aad922616df4153"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ae8bf76997b234ef68aad922616df4153">&#9670;&nbsp;</a></span>vmaGetPoolStats()</h2>
+<a id="abb343b27164d08d2b97e3b0c30ecdcbf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb343b27164d08d2b97e3b0c30ecdcbf">&#9670;&nbsp;</a></span>vmaGetPoolStats()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaGetPoolStats </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaGetPoolStats </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>
@@ -2671,14 +2800,14 @@
 
 </div>
 </div>
-<a id="a0d0eb0c1102268fa9a476d12ecbe4006"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a0d0eb0c1102268fa9a476d12ecbe4006">&#9670;&nbsp;</a></span>vmaInvalidateAllocation()</h2>
+<a id="a7489ab3d91f0011e2ed22f266f76966c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7489ab3d91f0011e2ed22f266f76966c">&#9670;&nbsp;</a></span>vmaInvalidateAllocation()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaInvalidateAllocation </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaInvalidateAllocation </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>
@@ -2722,14 +2851,14 @@
 
 </div>
 </div>
-<a id="a736bd6cbda886f36c891727e73bd4024"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a736bd6cbda886f36c891727e73bd4024">&#9670;&nbsp;</a></span>vmaMakePoolAllocationsLost()</h2>
+<a id="aaf235cb916f4c56feafdce45227fd17a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf235cb916f4c56feafdce45227fd17a">&#9670;&nbsp;</a></span>vmaMakePoolAllocationsLost()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaMakePoolAllocationsLost </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaMakePoolAllocationsLost </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>
@@ -2766,14 +2895,14 @@
 
 </div>
 </div>
-<a id="ad5bd1243512d099706de88168992f069"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ad5bd1243512d099706de88168992f069">&#9670;&nbsp;</a></span>vmaMapMemory()</h2>
+<a id="ae98119383e8e5754b6c09679386677d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae98119383e8e5754b6c09679386677d3">&#9670;&nbsp;</a></span>vmaMapMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaMapMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaMapMemory </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>
@@ -2801,22 +2930,22 @@
 <p>Maps memory represented by given allocation and returns pointer to it. </p>
 <p>Maps memory represented by given allocation to make it accessible to CPU code. When succeeded, <code>*ppData</code> contains pointer to first byte of this memory. If the allocation is part of bigger <code>VkDeviceMemory</code> block, the pointer is correctly offseted to the beginning of region assigned to this particular allocation.</p>
 <p>Mapping is internally reference-counted and synchronized, so despite raw Vulkan function <code>vkMapMemory()</code> cannot be used to map same block of <code>VkDeviceMemory</code> multiple times simultaneously, it is safe to call this function on allocations assigned to the same memory block. Actual Vulkan memory will be mapped on first mapping and unmapped on last unmapping.</p>
-<p>If the function succeeded, you must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> to unmap the allocation when mapping is no longer needed or before freeing the allocation, at the latest.</p>
-<p>It also safe to call this function multiple times on the same allocation. You must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.</p>
-<p>It is also safe to call this function on allocation created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag. Its memory stays mapped all the time. You must still call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. You must not call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> additional time to free the "0-th" mapping made automatically due to <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag.</p>
+<p>If the function succeeded, you must call <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> to unmap the allocation when mapping is no longer needed or before freeing the allocation, at the latest.</p>
+<p>It also safe to call this function multiple times on the same allocation. You must call <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.</p>
+<p>It is also safe to call this function on allocation created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag. Its memory stays mapped all the time. You must still call <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. You must not call <a class="el" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> additional time to free the "0-th" mapping made automatically due to <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag.</p>
 <p>This function fails when used on allocation made in memory type that is not <code>HOST_VISIBLE</code>.</p>
 <p>This function always fails when called for allocation that was created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag. Such allocations cannot be mapped. </p>
 
 </div>
 </div>
-<a id="a0ff488958ca72b28e545880463cb8696"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a0ff488958ca72b28e545880463cb8696">&#9670;&nbsp;</a></span>vmaResizeAllocation()</h2>
+<a id="a36e0067f27609620651eefdf98ce624e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36e0067f27609620651eefdf98ce624e">&#9670;&nbsp;</a></span>vmaResizeAllocation()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkResult vmaResizeAllocation </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaResizeAllocation </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>
@@ -2846,14 +2975,14 @@
 
 </div>
 </div>
-<a id="af9147d31ffc11d62fc187bde283ed14f"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#af9147d31ffc11d62fc187bde283ed14f">&#9670;&nbsp;</a></span>vmaSetAllocationUserData()</h2>
+<a id="a402558851f800ecd733800962c227f6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a402558851f800ecd733800962c227f6a">&#9670;&nbsp;</a></span>vmaSetAllocationUserData()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaSetAllocationUserData </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaSetAllocationUserData </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>
@@ -2884,14 +3013,14 @@
 
 </div>
 </div>
-<a id="ade56bf8dc9f5a5eaddf5f119ed525236"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ade56bf8dc9f5a5eaddf5f119ed525236">&#9670;&nbsp;</a></span>vmaSetCurrentFrameIndex()</h2>
+<a id="a763d86a0fa9613d81b19dc724d418f67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a763d86a0fa9613d81b19dc724d418f67">&#9670;&nbsp;</a></span>vmaSetCurrentFrameIndex()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaSetCurrentFrameIndex </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaSetCurrentFrameIndex </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>
@@ -2911,18 +3040,18 @@
 </div><div class="memdoc">
 
 <p>Sets index of the current frame. </p>
-<p>This function must be used if you make allocations with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flags to inform the allocator when a new frame begins. Allocations queried using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> cannot become lost in the current frame. </p>
+<p>This function must be used if you make allocations with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flags to inform the allocator when a new frame begins. Allocations queried using <a class="el" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> cannot become lost in the current frame. </p>
 
 </div>
 </div>
-<a id="a43d8ba9673c846f049089a5029d5c73a"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a43d8ba9673c846f049089a5029d5c73a">&#9670;&nbsp;</a></span>vmaTouchAllocation()</h2>
+<a id="a05304fd2aa5736517feee653e1d579d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05304fd2aa5736517feee653e1d579d1">&#9670;&nbsp;</a></span>vmaTouchAllocation()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VkBool32 vmaTouchAllocation </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkBool32 <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaTouchAllocation </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>
@@ -2948,14 +3077,14 @@
 
 </div>
 </div>
-<a id="a9bc268595cb33f6ec4d519cfce81ff45"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a9bc268595cb33f6ec4d519cfce81ff45">&#9670;&nbsp;</a></span>vmaUnmapMemory()</h2>
+<a id="a3128786cae5f317f51307074a487c278"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3128786cae5f317f51307074a487c278">&#9670;&nbsp;</a></span>vmaUnmapMemory()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void vmaUnmapMemory </td>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> void <a class="el" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> vmaUnmapMemory </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>
@@ -2974,17 +3103,18 @@
       </table>
 </div><div class="memdoc">
 
-<p>Unmaps memory represented by given allocation, mapped previously using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. </p>
-<p>For details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. </p>
+<p>Unmaps memory represented by given allocation, mapped previously using <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. </p>
+<p>For details, see description of <a class="el" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>. </p>
 
 </div>
 </div>
 </div><!-- contents -->
+<div class="ttc" id="avk__mem__alloc_8h_html_a0438b3d982473eb1c93c77c7ab3212e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaFreeMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html
index 6b95d7d..b62f0f6 100644
--- a/docs/html/vk__mem__alloc_8h_source.html
+++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: vk_mem_alloc.h Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -65,221 +65,14876 @@
 <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-2019 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="l01685"></a><span class="lineno"> 1685</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</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="l01687"></a><span class="lineno"> 1687</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01690"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1690</a></span>&#160;<span class="preprocessor">    #define VMA_RECORDING_ENABLED 0</span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;<span class="preprocessor">#ifndef NOMINMAX</span></div><div class="line"><a name="l01694"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90"> 1694</a></span>&#160;<span class="preprocessor">    #define NOMINMAX // For windows.h</span></div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;<span class="preprocessor">#ifndef VULKAN_H_</span></div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;<span class="preprocessor">    #include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;<span class="preprocessor">    #include &lt;windows.h&gt;</span></div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01709"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1709</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;<span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;<span class="preprocessor">    #if VK_KHR_bind_memory2</span></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 1</span></div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01717"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 1717</a></span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 0</span></div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</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="l01734"></a><span class="lineno"> 1734</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01739"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1739</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="l01740"></a><span class="lineno"> 1740</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;</div><div class="line"><a name="l01752"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1752</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="l01754"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1754</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="l01756"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1756</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="l01757"></a><span class="lineno"> 1757</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;</div><div class="line"><a name="l01760"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1760</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="l01765"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1765</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="l01787"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1787</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="l01799"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 1799</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;</div><div class="line"><a name="l01801"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1801</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="l01802"></a><span class="lineno"> 1802</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01803"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1803</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="l01804"></a><span class="lineno"> 1804</span>&#160;</div><div class="line"><a name="l01809"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1809</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="l01810"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1810</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01811"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1811</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01812"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1812</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01813"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1813</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01814"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1814</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01815"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1815</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01816"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1816</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div><div class="line"><a name="l01817"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1817</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div><div class="line"><a name="l01818"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1818</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01819"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1819</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01820"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1820</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01821"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1821</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01822"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1822</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01823"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1823</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01824"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1824</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01825"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1825</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01826"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 1826</a></span>&#160;    PFN_vkCmdCopyBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;    PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;</div><div class="line"><a name="l01838"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 1838</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="l01844"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 1844</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="l01845"></a><span class="lineno"> 1845</span>&#160;    </div><div class="line"><a name="l01846"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 1846</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="l01847"></a><span class="lineno"> 1847</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div><div class="line"><a name="l01848"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 1848</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="l01849"></a><span class="lineno"> 1849</span>&#160;</div><div class="line"><a name="l01851"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 1851</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="l01852"></a><span class="lineno"> 1852</span>&#160;{</div><div class="line"><a name="l01854"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 1854</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="l01862"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 1862</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="l01863"></a><span class="lineno"> 1863</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a>;</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;</div><div class="line"><a name="l01866"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1866</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="l01867"></a><span class="lineno"> 1867</span>&#160;{</div><div class="line"><a name="l01869"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1869</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="l01871"></a><span class="lineno"> 1871</span>&#160;</div><div class="line"><a name="l01872"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1872</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;</div><div class="line"><a name="l01875"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1875</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;</div><div class="line"><a name="l01878"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1878</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;</div><div class="line"><a name="l01881"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1881</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="l01883"></a><span class="lineno"> 1883</span>&#160;</div><div class="line"><a name="l01884"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1884</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="l01898"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1898</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01923"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1923</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="l01935"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1935</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="l01942"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 1942</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="l01943"></a><span class="lineno"> 1943</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</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="l01948"></a><span class="lineno"> 1948</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</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="l01952"></a><span class="lineno"> 1952</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</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="l01959"></a><span class="lineno"> 1959</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</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="l01967"></a><span class="lineno"> 1967</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</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="l01977"></a><span class="lineno"> 1977</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</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="l01990"></a><span class="lineno"> 1990</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;</div><div class="line"><a name="l01995"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1995</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="l01996"></a><span class="lineno"> 1996</span>&#160;{</div><div class="line"><a name="l01998"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1998</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l02000"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2000</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l02002"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2002</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l02004"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2004</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l02006"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2006</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l02007"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 2007</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="l02008"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 2008</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="l02009"></a><span class="lineno"> 2009</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;</div><div class="line"><a name="l02012"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2012</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="l02013"></a><span class="lineno"> 2013</span>&#160;{</div><div class="line"><a name="l02014"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2014</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="l02015"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2015</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="l02016"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2016</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="l02017"></a><span class="lineno"> 2017</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</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="l02021"></a><span class="lineno"> 2021</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;<span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02025"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2025</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</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="l02034"></a><span class="lineno"> 2034</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</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="l02039"></a><span class="lineno"> 2039</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;</div><div class="line"><a name="l02054"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2054</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;{</div><div class="line"><a name="l02059"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2059</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="l02076"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2076</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="l02086"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2086</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="l02093"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2093</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="l02102"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2102</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="l02103"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 2103</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="l02104"></a><span class="lineno"> 2104</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;</div><div class="line"><a name="l02107"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2107</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="l02114"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2114</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="l02115"></a><span class="lineno"> 2115</span>&#160;</div><div class="line"><a name="l02125"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2125</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="l02138"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2138</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="l02151"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2151</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="l02158"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2158</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="l02164"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2164</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="l02169"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2169</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="l02175"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2175</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;</div><div class="line"><a name="l02180"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2180</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="l02184"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2184</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="l02191"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2191</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="l02192"></a><span class="lineno"> 2192</span>&#160;</div><div class="line"><a name="l02195"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2195</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="l02198"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2198</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="l02201"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2201</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="l02202"></a><span class="lineno"> 2202</span>&#160;</div><div class="line"><a name="l02205"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2205</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="l02206"></a><span class="lineno"> 2206</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="l02207"></a><span class="lineno"> 2207</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="l02208"></a><span class="lineno"> 2208</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="l02209"></a><span class="lineno"> 2209</span>&#160;</div><div class="line"><a name="l02210"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 2210</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="l02211"></a><span class="lineno"> 2211</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l02212"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2212</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="l02213"></a><span class="lineno"> 2213</span>&#160;</div><div class="line"><a name="l02214"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2214</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="l02215"></a><span class="lineno"> 2215</span>&#160;{</div><div class="line"><a name="l02217"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2217</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="l02223"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2223</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="l02228"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2228</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l02233"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2233</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l02241"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2241</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l02247"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2247</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="l02254"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2254</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="l02255"></a><span class="lineno"> 2255</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</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="l02277"></a><span class="lineno"> 2277</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</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="l02295"></a><span class="lineno"> 2295</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</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="l02313"></a><span class="lineno"> 2313</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;</div><div class="line"><a name="l02316"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2316</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="l02334"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2334</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="l02335"></a><span class="lineno"> 2335</span>&#160;</div><div class="line"><a name="l02351"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2351</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="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02362"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2362</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="l02363"></a><span class="lineno"> 2363</span>&#160;</div><div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2366</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="l02367"></a><span class="lineno"> 2367</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="l02368"></a><span class="lineno"> 2368</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="l02369"></a><span class="lineno"> 2369</span>&#160;</div><div class="line"><a name="l02370"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 2370</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="l02371"></a><span class="lineno"> 2371</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l02372"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2372</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="l02373"></a><span class="lineno"> 2373</span>&#160;</div><div class="line"><a name="l02376"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2376</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="l02379"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 2379</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l02382"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 2382</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="l02391"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 2391</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l02396"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 2396</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="l02404"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 2404</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="l02418"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 2418</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;</div><div class="line"><a name="l02423"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 2423</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="l02426"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 2426</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l02429"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 2429</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l02432"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 2432</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="l02435"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 2435</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="l02442"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 2442</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l02445"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 2445</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="l02446"></a><span class="lineno"> 2446</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</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="l02457"></a><span class="lineno"> 2457</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</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="l02462"></a><span class="lineno"> 2462</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</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="l02472"></a><span class="lineno"> 2472</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</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="l02483"></a><span class="lineno"> 2483</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</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="l02502"></a><span class="lineno"> 2502</span>&#160;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;</div><div class="line"><a name="l02531"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 2531</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l02536"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 2536</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l02545"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 2545</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l02550"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 2550</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l02555"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 2555</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l02564"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 2564</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="l02569"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 2569</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="l02570"></a><span class="lineno"> 2570</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</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="l02586"></a><span class="lineno"> 2586</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</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="l02612"></a><span class="lineno"> 2612</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</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="l02626"></a><span class="lineno"> 2626</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;    VkImage image,</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</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="l02634"></a><span class="lineno"> 2634</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</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="l02642"></a><span class="lineno"> 2642</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</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;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;    VkDeviceSize newSize);</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</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="l02688"></a><span class="lineno"> 2688</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</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="l02724"></a><span class="lineno"> 2724</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</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;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</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="l02739"></a><span class="lineno"> 2739</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</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="l02786"></a><span class="lineno"> 2786</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</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="l02806"></a><span class="lineno"> 2806</span>&#160;</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</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="l02824"></a><span class="lineno"> 2824</span>&#160;</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</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="l02842"></a><span class="lineno"> 2842</span>&#160;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</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="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="l02853"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"> 2853</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="l02854"></a><span class="lineno"> 2854</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div><div class="line"><a name="l02855"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 2855</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="l02856"></a><span class="lineno"> 2856</span>&#160;</div><div class="line"><a name="l02861"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 2861</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="l02864"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 2864</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="l02867"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 2867</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div><div class="line"><a name="l02876"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96"> 2876</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="l02882"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 2882</a></span>&#160;    VkBool32* <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div><div class="line"><a name="l02885"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 2885</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div><div class="line"><a name="l02901"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1"> 2901</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* <a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>;</div><div class="line"><a name="l02906"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 2906</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div><div class="line"><a name="l02911"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 2911</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div><div class="line"><a name="l02916"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 2916</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div><div class="line"><a name="l02921"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 2921</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div><div class="line"><a name="l02930"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 2930</a></span>&#160;    VkCommandBuffer <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">VmaDefragmentationInfo2</a>;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;</div><div class="line"><a name="l02937"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 2937</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="l02942"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 2942</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l02947"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 2947</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;</div><div class="line"><a name="l02951"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 2951</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="l02953"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 2953</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l02955"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 2955</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l02957"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 2957</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l02959"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 2959</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</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="l02994"></a><span class="lineno"> 2994</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext);</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</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="l03052"></a><span class="lineno"> 3052</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;    VkImage image);</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;    VkImage image,</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</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="l03152"></a><span class="lineno"> 3152</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</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="l03168"></a><span class="lineno"> 3168</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</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="l03177"></a><span class="lineno"> 3177</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</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="l03193"></a><span class="lineno"> 3193</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;    VkImage image,</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></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="preprocessor">#endif</span></div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;<span class="comment">CONFIGURATION SECTION</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">Define some of these macros before each #include of this header or change them</span></div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</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;</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</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="l03224"></a><span class="lineno"> 3224</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</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="l03229"></a><span class="lineno"> 3229</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;<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="l03236"></a><span class="lineno"> 3236</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</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="l03242"></a><span class="lineno"> 3242</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;<span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;    <span class="comment">// Compiler conforms to C++17.</span></div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;<span class="preprocessor">    #if __cplusplus &gt;= 201703L</span></div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;    <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;    <span class="comment">// Otherwise it&#39;s always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;    <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;<span class="preprocessor">    #elif defined(_MSC_FULL_VER) &amp;&amp; _MSC_FULL_VER &gt;= 190023918 &amp;&amp; __cplusplus == 199711L &amp;&amp; _MSVC_LANG &gt;= 201703L</span></div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 0</span></div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;<span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;<span class="comment">Library has its own container implementation.</span></div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</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="l03282"></a><span class="lineno"> 3282</span>&#160;<span class="comment">remove them if not needed.</span></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="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span></div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</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="l03290"></a><span class="lineno"> 3290</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#if defined(__ANDROID_API__) &amp;&amp; (__ANDROID_API__ &lt; 16)</span></div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</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="l03296"></a><span class="lineno"> 3296</span>&#160;{</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</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="l03299"></a><span class="lineno"> 3299</span>&#160;    {</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;    }</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">return</span> memalign(alignment, size);</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="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</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="l03308"></a><span class="lineno"> 3308</span>&#160;{</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</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="l03311"></a><span class="lineno"> 3311</span>&#160;    {</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</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="keywordtype">void</span> *pointer;</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;}</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></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="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</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="l03395"></a><span class="lineno"> 3395</span>&#160;    {</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</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="l03397"></a><span class="lineno"> 3397</span>&#160;    }</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</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="l03399"></a><span class="lineno"> 3399</span>&#160;    {</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</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="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">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="l03403"></a><span class="lineno"> 3403</span>&#160;    {</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, 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;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    <span class="keyword">class </span>VmaMutex</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="keyword">public</span>:</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;        std::mutex m_Mutex;</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="preprocessor">    #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;<span class="preprocessor">#endif</span></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="comment">// Read-write mutex, where &quot;read&quot; is shared access, &quot;write&quot; is exclusive access.</span></div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;<span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;<span class="preprocessor">    #if VMA_USE_STL_SHARED_MUTEX</span></div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;        <span class="comment">// Use std::shared_mutex from C++17.</span></div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;<span class="preprocessor">        #include &lt;shared_mutex&gt;</span></div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;        <span class="keyword">class </span>VmaRWMutex</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;        <span class="keyword">public</span>:</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;        <span class="keyword">private</span>:</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;            std::shared_mutex m_Mutex;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;        };</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;<span class="preprocessor">    #elif defined(_WIN32) &amp;&amp; defined(WINVER) &amp;&amp; WINVER &gt;= 0x0600</span></div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;        <span class="comment">// Use SRWLOCK from WinAPI.</span></div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;        <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;        <span class="keyword">class </span>VmaRWMutex</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="keyword">public</span>:</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;            VmaRWMutex() { InitializeSRWLock(&amp;m_Lock); }</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;            <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&amp;m_Lock); }</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&amp;m_Lock); }</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;            <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&amp;m_Lock); }</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&amp;m_Lock); }</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;        <span class="keyword">private</span>:</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;            SRWLOCK m_Lock;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;        };</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;        <span class="comment">// Less efficient fallback: Use normal mutex.</span></div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;        <span class="keyword">class </span>VmaRWMutex</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;        <span class="keyword">public</span>:</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;        <span class="keyword">private</span>:</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;            VMA_MUTEX m_Mutex;</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="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;<span class="preprocessor">    #endif // #if VMA_USE_STL_SHARED_MUTEX</span></div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_RW_MUTEX</span></div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</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="l03469"></a><span class="lineno"> 3469</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;<span class="preprocessor">        private: \</span></div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</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="l03558"></a><span class="lineno"> 3558</span>&#160;</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</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="l03560"></a><span class="lineno"> 3560</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="l03561"></a><span class="lineno"> 3561</span>&#160;</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</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;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</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;<span class="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</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;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;    <span class="keywordflow">return</span> c;</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="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;{</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;}</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;{</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;    <span class="keywordflow">return</span> val / align * align;</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;</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</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;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</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="comment">/*</span></div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;<span class="comment">For 0 returns true.</span></div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;{</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;    <span class="keywordflow">return</span> (x &amp; (x-1)) == 0;</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;</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</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;    v--;</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;    v++;</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;    <span class="keywordflow">return</span> v;</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;}</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</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;    v--;</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;    v++;</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;    <span class="keywordflow">return</span> v;</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;</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;{</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;    <span class="keywordflow">return</span> v;</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="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</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;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;    <span class="keywordflow">return</span> v;</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;</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</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="l03664"></a><span class="lineno"> 3664</span>&#160;{</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</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;</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;{</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;    {</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</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="l03675"></a><span class="lineno"> 3675</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</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="l03677"></a><span class="lineno"> 3677</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</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;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</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="l03691"></a><span class="lineno"> 3691</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</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;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</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;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</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;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</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;                VMA_SWAP(*memTypeIndex, *insertIndex);</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;            ++insertIndex;</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="keywordflow">if</span>(insertIndex != centerValue)</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_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;    }</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;}</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;<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="l03714"></a><span class="lineno"> 3714</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;{</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</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;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</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;}</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;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</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="l03733"></a><span class="lineno"> 3733</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="l03734"></a><span class="lineno"> 3734</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;    VkDeviceSize pageSize)</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;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;}</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="keyword">enum</span> VmaSuballocationType</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;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;};</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</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="l03764"></a><span class="lineno"> 3764</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;    VmaSuballocationType suballocType2)</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;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;    {</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</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;    </div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</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="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;    }</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;}</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</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="l03802"></a><span class="lineno"> 3802</span>&#160;{</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</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="l03806"></a><span class="lineno"> 3806</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="l03807"></a><span class="lineno"> 3807</span>&#160;    {</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;    }</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;    <span class="comment">// no-op</span></div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;}</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</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="l03816"></a><span class="lineno"> 3816</span>&#160;{</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</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="l03819"></a><span class="lineno"> 3819</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="l03820"></a><span class="lineno"> 3820</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="l03821"></a><span class="lineno"> 3821</span>&#160;    {</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;        {</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</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;    }</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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">/*</span></div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;<span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;<span class="comment">during GPU memory defragmentation.</span></div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo&amp; outBufCreateInfo)</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;    memset(&amp;outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;    outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;    outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;    outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></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;</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</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="l03844"></a><span class="lineno"> 3844</span>&#160;<span class="keyword">struct </span>VmaMutexLock</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;    VMA_CLASS_NO_COPY(VmaMutexLock)</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Lock(); } }</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;    ~VmaMutexLock()</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Unlock(); } }</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;};</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;<span class="keyword">struct </span>VmaMutexLockRead</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;{</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockRead)</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;    VmaMutexLockRead(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockRead(); } }</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;    ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockRead(); } }</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;};</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;<span class="keyword">struct </span>VmaMutexLockWrite</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;{</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockWrite)</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;    VmaMutexLockWrite(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockWrite(); } }</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;    ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockWrite(); } }</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;    VMA_RW_MUTEX* m_pMutex;</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;</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</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="l03892"></a><span class="lineno"> 3892</span>&#160;</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</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="l03895"></a><span class="lineno"> 3895</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</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="l03900"></a><span class="lineno"> 3900</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</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="l03903"></a><span class="lineno"> 3903</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, <span class="keyword">const</span> CmpLess&amp; cmp)</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;{</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;    <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;    {</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;        {</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;            down = mid + 1;</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;        }</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;        <span class="keywordflow">else</span></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;            up = mid;</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        }</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;    }</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;    <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;}</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="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="l03922"></a><span class="lineno"> 3922</span>&#160;IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value, <span class="keyword">const</span> CmpLess&amp; cmp)</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;{</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;        beg, end, value, cmp);</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;        (!cmp(*it, value) &amp;&amp; !cmp(value, *it)))</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="keywordflow">return</span> it;</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="keywordflow">return</span> end;</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;}</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;<span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;<span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;<span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;<span class="comment">*/</span></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;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;{</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; count; ++i)</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;    {</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;        <span class="keyword">const</span> T iPtr = arr[i];</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;        <span class="keywordflow">if</span>(iPtr == VMA_NULL)</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;            <span class="keywordflow">return</span> <span class="keyword">false</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="keywordflow">for</span>(uint32_t j = i + 1; j &lt; count; ++j)</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="keywordflow">if</span>(iPtr == arr[j])</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="keywordflow">return</span> <span class="keyword">false</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;    }</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;<span class="comment">// Memory allocation</span></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="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="l03964"></a><span class="lineno"> 3964</span>&#160;{</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</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;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;            size,</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;            alignment,</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</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="keywordflow">else</span></div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;    {</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</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;}</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;<span class="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="l03981"></a><span class="lineno"> 3981</span>&#160;{</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;    {</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;    }</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;    {</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;    }</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;}</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</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="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</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;</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</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="l04001"></a><span class="lineno"> 4001</span>&#160;{</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</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="l04003"></a><span class="lineno"> 4003</span>&#160;}</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></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;<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="l04008"></a><span class="lineno"> 4008</span>&#160;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</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="l04011"></a><span class="lineno"> 4011</span>&#160;{</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</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;</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</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="l04018"></a><span class="lineno"> 4018</span>&#160;{</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;        {</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;            ptr[i].~T();</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;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;    }</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;}</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;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;<span class="keyword">class </span>VmaStlAllocator</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;<span class="keyword">public</span>:</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;    <span class="keyword">typedef</span> T value_type;</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;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</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="l04039"></a><span class="lineno"> 4039</span>&#160;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</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="l04041"></a><span class="lineno"> 4041</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="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> U&gt;</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</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="l04045"></a><span class="lineno"> 4045</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</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;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</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="l04050"></a><span class="lineno"> 4050</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;    }</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;};</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;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</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="l04062"></a><span class="lineno"> 4062</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="l04063"></a><span class="lineno"> 4063</span>&#160;{</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;}</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</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="l04069"></a><span class="lineno"> 4069</span>&#160;{</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;    vec.erase(vec.begin() + index);</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;</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</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="l04077"></a><span class="lineno"> 4077</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</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="l04079"></a><span class="lineno"> 4079</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;{</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;    <span class="keyword">typedef</span> T value_type;</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;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;        m_Count(0),</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        m_Capacity(0)</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;    }</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;        m_Count(count),</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;        m_Capacity(count)</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;    }</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;    </div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</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="l04103"></a><span class="lineno"> 4103</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;        m_Capacity(src.m_Count)</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;        <span class="keywordflow">if</span>(m_Count != 0)</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;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;    }</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;    </div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;    ~VmaVector()</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;    {</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</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;</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</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;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</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;            resize(rhs.m_Count);</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;            {</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;        }</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;    }</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;    </div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</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="l04131"></a><span class="lineno"> 4131</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="l04132"></a><span class="lineno"> 4132</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</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="l04134"></a><span class="lineno"> 4134</span>&#160;    </div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;    {</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;    }</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</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="l04141"></a><span class="lineno"> 4141</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</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;    T&amp; front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;    }</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;    }</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;    T&amp; back()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;    }</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</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;</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</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="l04168"></a><span class="lineno"> 4168</span>&#160;    {</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        </div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;        {</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;            newCapacity = m_Capacity;</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;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;        {</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</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="l04179"></a><span class="lineno"> 4179</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</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;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;            }</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;            m_pArray = newArray;</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;    }</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="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="l04190"></a><span class="lineno"> 4190</span>&#160;    {</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</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;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;        }</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;        {</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;            newCapacity = newCount;</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;        }</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</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;            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="l04204"></a><span class="lineno"> 4204</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="l04205"></a><span class="lineno"> 4205</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</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;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</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;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;            m_pArray = newArray;</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;</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;    }</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</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="l04218"></a><span class="lineno"> 4218</span>&#160;    {</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;    }</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</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="l04223"></a><span class="lineno"> 4223</span>&#160;    {</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;        {</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</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;        m_pArray[index] = src;</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;    }</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;    {</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</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;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;        }</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;        resize(oldCount - 1);</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;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;    {</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;        m_pArray[newIndex] = src;</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;    <span class="keywordtype">void</span> pop_back()</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;    {</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;        resize(size() - 1);</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;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;    {</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;        insert(0, src);</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;</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;    {</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;        remove(0);</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;</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;    T* m_pArray;</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</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;</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</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="l04282"></a><span class="lineno"> 4282</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="l04283"></a><span class="lineno"> 4283</span>&#160;{</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</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="l04289"></a><span class="lineno"> 4289</span>&#160;{</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;    vec.remove(index);</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;}</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</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="l04297"></a><span class="lineno"> 4297</span>&#160;{</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;        vector.data(),</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;        value,</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;}</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</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="l04308"></a><span class="lineno"> 4308</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="l04309"></a><span class="lineno"> 4309</span>&#160;{</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;        vector.begin(),</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;        vector.end(),</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;        value,</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;        comparator);</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</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="l04317"></a><span class="lineno"> 4317</span>&#160;    {</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;    }</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;}</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;<span class="comment">// class VmaPoolAllocator</span></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="comment">/*</span></div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</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="l04330"></a><span class="lineno"> 4330</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;{</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;    T* Alloc();</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;    <span class="keyword">union </span>Item</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;        uint32_t NextFreeIndex;</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;        T Value;</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;    };</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;    <span class="keyword">struct </span>ItemBlock</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;        Item* pItems;</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;        uint32_t Capacity;</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;        uint32_t FirstFreeIndex;</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;    </div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;    <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</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;    ItemBlock&amp; CreateNewBlock();</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;</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;    m_FirstBlockCapacity(firstBlockCapacity),</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</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;    VMA_ASSERT(m_FirstBlockCapacity &gt; 1);</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</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;    Clear();</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;}</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;{</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</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;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</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;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;        }</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;    }</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;{</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</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;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;        </div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</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;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + block.Capacity))</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;        {</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;            <span class="keyword">const</span> uint32_t index = static_cast&lt;uint32_t&gt;(pItemPtr - block.pItems);</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;        }</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;    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="l04432"></a><span class="lineno"> 4432</span>&#160;}</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</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="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;        m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;    <span class="keyword">const</span> ItemBlock newBlock = {</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;        newBlockCapacity,</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;        0 };</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;    m_ItemBlocks.push_back(newBlock);</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="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; newBlockCapacity - 1; ++i)</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;    newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</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;</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></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="preprocessor">#if VMA_USE_STL_LIST</span></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;<span class="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></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">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;<span class="keyword">struct </span>VmaListItem</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;    VmaListItem* pPrev;</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;    T Value;</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;};</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;<span class="keyword">class </span>VmaRawList</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;    VMA_CLASS_NO_COPY(VmaRawList)</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</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;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</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="l04485"></a><span class="lineno"> 4485</span>&#160;</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</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="l04488"></a><span class="lineno"> 4488</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</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="l04490"></a><span class="lineno"> 4490</span>&#160;</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    <span class="keywordtype">void</span> PopFront();</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    </div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</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="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    m_Count(0)</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;}</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">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;{</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;}</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;{</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;    {</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</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;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;            pItem = pPrevItem;</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;        m_pFront = VMA_NULL;</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;        m_Count = 0;</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;    }</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;}</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;{</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;    {</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;        m_Count = 1;</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;    <span class="keywordflow">else</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;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;        ++m_Count;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;    }</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;}</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;{</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;    {</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;        m_Count = 1;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;    }</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;    {</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;        ++m_Count;</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="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;}</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</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="l04597"></a><span class="lineno"> 4597</span>&#160;{</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</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="l04605"></a><span class="lineno"> 4605</span>&#160;{</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;}</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;{</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;    {</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    }</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;    --m_Count;</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;}</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;{</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;    {</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</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;    m_pFront = pNextItem;</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;    --m_Count;</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;}</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;{</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</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;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</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;    <span class="keywordflow">else</span></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;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;    }</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="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</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;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;    }</div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    {</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;    }</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;    --m_Count;</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;}</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;{</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</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;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;        {</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;            prevItem-&gt;pNext = newItem;</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="keywordflow">else</span></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;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;        }</div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;        ++m_Count;</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;    }</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;}</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;</div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;{</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</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;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</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;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;        }</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;        <span class="keywordflow">else</span></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;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;        }</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;        ++m_Count;</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;        <span class="keywordflow">return</span> newItem;</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="keywordflow">else</span></div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;        <span class="keywordflow">return</span> PushFront();</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;</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</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="l04725"></a><span class="lineno"> 4725</span>&#160;{</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</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="l04733"></a><span class="lineno"> 4733</span>&#160;{</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;}</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;</div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;<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="l04740"></a><span class="lineno"> 4740</span>&#160;<span class="keyword">class </span>VmaList</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;    VMA_CLASS_NO_COPY(VmaList)</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;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;    {</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;        iterator() :</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;        {</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;        }</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</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;        T* operator-&gt;()<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;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</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;</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;        iterator&amp; operator++()</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;        {</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;        iterator&amp; operator--()</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;        {</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;            {</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</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="keywordflow">else</span></div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;            {</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;            }</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;        }</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;        {</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;        }</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        {</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;        }</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</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="l04798"></a><span class="lineno"> 4798</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</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;        <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="l04803"></a><span class="lineno"> 4803</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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;        </div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;        {</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;        }</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    };</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;    <span class="keyword">class </span>const_iterator</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;    {</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;        const_iterator() :</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;        {</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;        }</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;        {</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;        }</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;        </div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;        }</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;        }</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;        const_iterator&amp; operator++()</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;        {</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;        }</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;        const_iterator&amp; operator--()</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;        {</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;            {</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;            }</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;            {</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;                m_pItem = m_pList-&gt;Back();</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="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;        }</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</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;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;            <span class="keywordflow">return</span> result;</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;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;        {</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;        }</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</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="l04881"></a><span class="lineno"> 4881</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</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="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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;        </div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</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="l04893"></a><span class="lineno"> 4893</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;        {</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;</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</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;</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</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="l04907"></a><span class="lineno"> 4907</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="l04908"></a><span class="lineno"> 4908</span>&#160;</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</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;    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="l04913"></a><span class="lineno"> 4913</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="l04914"></a><span class="lineno"> 4914</span>&#160;</div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</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="l04917"></a><span class="lineno"> 4917</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</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="l04919"></a><span class="lineno"> 4919</span>&#160;</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</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="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;<span class="comment">// class VmaMap</span></div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;<span class="comment">// Unused in this version.</span></div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</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="l04938"></a><span class="lineno"> 4938</span>&#160;</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;<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="l04942"></a><span class="lineno"> 4942</span>&#160;<span class="keyword">struct </span>VmaPair</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;    T1 first;</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;    T2 second;</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;    VmaPair() : first(), second() { }</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</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="l04949"></a><span class="lineno"> 4949</span>&#160;};</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</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="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;<span class="keyword">class </span>VmaMap</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="keyword">public</span>:</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;    </div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;};</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</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="l04977"></a><span class="lineno"> 4977</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;{</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</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="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;    }</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;    <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="l04984"></a><span class="lineno"> 4984</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;    }</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;};</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;<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="l04990"></a><span class="lineno"> 4990</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="l04991"></a><span class="lineno"> 4991</span>&#160;{</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;        pair,</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;}</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</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="l05001"></a><span class="lineno"> 5001</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="l05002"></a><span class="lineno"> 5002</span>&#160;{</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;        key,</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</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="keywordflow">return</span> it;</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;    }</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;    {</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</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;}</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</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="l05019"></a><span class="lineno"> 5019</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;{</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</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;</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;{</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</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="l05038"></a><span class="lineno"> 5038</span>&#160;</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;    {</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;    };</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">public</span>:</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;    {</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;        ALLOCATION_TYPE_DEDICATED,</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;</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">    This struct cannot have constructor or destructor. It must be POD because it is</span></div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;<span class="comment">    allocated using VmaPoolAllocator.</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;</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;    <span class="keywordtype">void</span> Ctor(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString)</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;    {</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;        m_Alignment = 1;</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;        m_Size = 0;</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;        m_LastUseFrameIndex = currentFrameIndex;</div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_NONE;</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;        m_SuballocationType = (uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN;</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;        m_MapCount = 0;</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;        m_Flags = userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0;</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;        m_BufferImageUsage = 0;</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;    }</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;    <span class="keywordtype">void</span> Dtor()</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;    {</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</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="l05077"></a><span class="lineno"> 5077</span>&#160;</div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</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;</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;    {</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;        m_Size = size;</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;    }</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;    {</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;    }</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="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;        VkDeviceSize offset); </div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;    <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</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="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;        VkDeviceSize size)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;        m_Size = size;</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;    }</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</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="l05144"></a><span class="lineno"> 5144</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="l05145"></a><span class="lineno"> 5145</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="l05146"></a><span class="lineno"> 5146</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    }</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</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="l05157"></a><span class="lineno"> 5157</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;    </div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</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="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;    {</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</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="comment">/*</span></div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</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="l05171"></a><span class="lineno"> 5171</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</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="l05179"></a><span class="lineno"> 5179</span>&#160;    {</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</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="l05187"></a><span class="lineno"> 5187</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;    }</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="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</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="l05194"></a><span class="lineno"> 5194</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="l05195"></a><span class="lineno"> 5195</span>&#160;</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</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;        VMA_ASSERT(m_BufferImageUsage == 0);</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;    }</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;    <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="l05207"></a><span class="lineno"> 5207</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">private</span>:</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</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="l05217"></a><span class="lineno"> 5217</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;</div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    {</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;    };</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</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;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</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="l05235"></a><span class="lineno"> 5235</span>&#160;    };</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;    <span class="keyword">union</span></div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;    {</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</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;</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;    uint32_t m_CreationFrameIndex;</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</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="l05251"></a><span class="lineno"> 5251</span>&#160;};</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;<span class="keyword">struct </span>VmaSuballocation</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;    VkDeviceSize offset;</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;};</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;<span class="comment">// Comparator for offsets.</span></div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</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;    <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="l05269"></a><span class="lineno"> 5269</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</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="keyword">struct </span>VmaSuballocationOffsetGreater</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;{</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;    <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="l05276"></a><span class="lineno"> 5276</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;    }</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;};</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;<span class="keyword">enum class</span> VmaAllocationRequestType</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;    Normal,</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;    <span class="comment">// Used by &quot;Linear&quot; algorithm.</span></div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;    UpperAddress,</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    EndOf1st,</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    EndOf2nd,</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;</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</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="l05306"></a><span class="lineno"> 5306</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</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;    VkDeviceSize offset;</div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</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="l05313"></a><span class="lineno"> 5313</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;    <span class="keywordtype">void</span>* customData;</div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;    VmaAllocationRequestType type;</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;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;    }</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;};</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;</div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;{</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</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="l05337"></a><span class="lineno"> 5337</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</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="l05339"></a><span class="lineno"> 5339</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</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="l05343"></a><span class="lineno"> 5343</span>&#160;</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</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="l05345"></a><span class="lineno"> 5345</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</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="l05347"></a><span class="lineno"> 5347</span>&#160;</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</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="l05350"></a><span class="lineno"> 5350</span>&#160;<span class="preprocessor">#endif</span></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">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;        <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</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="l05386"></a><span class="lineno"> 5386</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</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">protected</span>:</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</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="l05390"></a><span class="lineno"> 5390</span>&#160;</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;        VkDeviceSize unusedBytes,</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</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="l05403"></a><span class="lineno"> 5403</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;};</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;<span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot; #cond); \</span></div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;<span class="preprocessor">        return false; \</span></div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;<span class="preprocessor">    } } while(false)</span></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;<span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;{</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</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="l05425"></a><span class="lineno"> 5425</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="l05426"></a><span class="lineno"> 5426</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    <span class="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="l05430"></a><span class="lineno"> 5430</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="l05431"></a><span class="lineno"> 5431</span>&#160;</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</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="l05434"></a><span class="lineno"> 5434</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</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="l05464"></a><span class="lineno"> 5464</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    <span class="comment">// For defragmentation</span></div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;    </div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;        VmaSuballocationType&amp; inOutPrevSuballocType) <span class="keyword">const</span>;</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</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;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <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">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</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="l05502"></a><span class="lineno"> 5502</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;};</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;<span class="comment">/*</span></div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</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="l05603"></a><span class="lineno"> 5603</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="l05604"></a><span class="lineno"> 5604</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</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="l05606"></a><span class="lineno"> 5606</span>&#160;</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</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="l05608"></a><span class="lineno"> 5608</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="l05609"></a><span class="lineno"> 5609</span>&#160;</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</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="l05612"></a><span class="lineno"> 5612</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</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="l05642"></a><span class="lineno"> 5642</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</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">private</span>:</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;    {</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;        SECOND_VECTOR_EMPTY,</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</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="l05659"></a><span class="lineno"> 5659</span>&#160;<span class="comment">        all have smaller offset.</span></div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</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="l05666"></a><span class="lineno"> 5666</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;    };</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;    uint32_t m_1stVectorIndex;</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</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;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</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="l05678"></a><span class="lineno"> 5678</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="l05679"></a><span class="lineno"> 5679</span>&#160;    </div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;    <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</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="l05683"></a><span class="lineno"> 5683</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</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;    <span class="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;};</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;<span class="comment">  It is repoted as separate, unused range, not available for allocations.</span></div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</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="l05721"></a><span class="lineno"> 5721</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="l05722"></a><span class="lineno"> 5722</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;{</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</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="l05733"></a><span class="lineno"> 5733</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="l05734"></a><span class="lineno"> 5734</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</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="l05736"></a><span class="lineno"> 5736</span>&#160;</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</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="l05738"></a><span class="lineno"> 5738</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="l05739"></a><span class="lineno"> 5739</span>&#160;</div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</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="l05742"></a><span class="lineno"> 5742</span>&#160;<span class="preprocessor">#endif</span></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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;</div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;    <span class="keyword">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="l05764"></a><span class="lineno"> 5764</span>&#160;</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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="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="l05772"></a><span class="lineno"> 5772</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="l05773"></a><span class="lineno"> 5773</span>&#160;</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</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="l05777"></a><span class="lineno"> 5777</span>&#160;</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;    <span class="keyword">struct </span>ValidationContext</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    {</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;        <span class="keywordtype">size_t</span> calculatedAllocationCount;</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;        VkDeviceSize calculatedSumFreeSize;</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;        ValidationContext() :</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;            calculatedAllocationCount(0),</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;            calculatedFreeCount(0),</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;            calculatedSumFreeSize(0) { }</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;    };</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;    <span class="keyword">struct </span>Node</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    {</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;        VkDeviceSize offset;</div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;        <span class="keyword">enum</span> TYPE</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;        {</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;            TYPE_FREE,</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;            TYPE_ALLOCATION,</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;            TYPE_SPLIT,</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;            TYPE_COUNT</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;        } type;</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;        Node* parent;</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;        Node* buddy;</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;        <span class="keyword">union</span></div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;        {</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;            <span class="keyword">struct</span></div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;            {</div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;                Node* prev;</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;                Node* next;</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;            } free;</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;            <span class="keyword">struct</span></div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;            {</div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;            } allocation;</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;            <span class="keyword">struct</span></div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;            {</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;                Node* leftChild;</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;            } split;</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;        };</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;    };</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;    <span class="comment">// Size of the memory block aligned down to a power of two.</span></div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;    VkDeviceSize m_UsableSize;</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;    uint32_t m_LevelCount;</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;    Node* m_Root;</div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;    <span class="keyword">struct </span>{</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;        Node* front;</div><div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;        Node* back;</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;    } m_FreeList[MAX_LEVELS];</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</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="l05835"></a><span class="lineno"> 5835</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</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="l05840"></a><span class="lineno"> 5840</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</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="l05842"></a><span class="lineno"> 5842</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</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="l05844"></a><span class="lineno"> 5844</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="l05845"></a><span class="lineno"> 5845</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</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="l05856"></a><span class="lineno"> 5856</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;{</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;    VmaBlockMetadata* m_pMetadata;</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;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;    ~VmaDeviceMemoryBlock()</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;        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="l05876"></a><span class="lineno"> 5876</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;    }</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;        VkDeviceSize newSize,</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</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="l05890"></a><span class="lineno"> 5890</span>&#160;    </div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</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="l05896"></a><span class="lineno"> 5896</span>&#160;</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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">// ppData can be null.</span></div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</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="l05904"></a><span class="lineno"> 5904</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="l05905"></a><span class="lineno"> 5905</span>&#160;</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</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="l05907"></a><span class="lineno"> 5907</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="l05908"></a><span class="lineno"> 5908</span>&#160;</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;        VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;        VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;        VkImage hImage,</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</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="keyword">private</span>:</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;    VkDeviceMemory m_hMemory;</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="comment">/*</span></div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</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="l05930"></a><span class="lineno"> 5930</span>&#160;<span class="comment">    Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;<span class="comment">    Allocations, deallocations, any change in m_pMetadata is protected by parent&#39;s VmaBlockVector::m_Mutex.</span></div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;};</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="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;{</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;    <span class="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="l05941"></a><span class="lineno"> 5941</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;    }</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;};</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;<span class="keyword">struct </span>VmaDefragmentationMove</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;{</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex;</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;    <span class="keywordtype">size_t</span> dstBlockIndex;</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;    VkDeviceSize srcOffset;</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;    VkDeviceSize dstOffset;</div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;};</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="keyword">class </span>VmaDefragmentationAlgorithm;</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="comment">/*</span></div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;<span class="keyword">struct </span>VmaBlockVector</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;    VMA_CLASS_NO_COPY(VmaBlockVector)</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;        <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;    ~VmaBlockVector();</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;    VkResult CreateMinBlocks();</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</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="l05991"></a><span class="lineno"> 5991</span>&#160;</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</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="l05993"></a><span class="lineno"> 5993</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</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;    VkResult Allocate(</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</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="l06000"></a><span class="lineno"> 6000</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</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="keywordtype">void</span> Free(</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</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="l06009"></a><span class="lineno"> 6009</span>&#160;</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;<span class="preprocessor">#endif</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="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;    VkResult CheckCorruption();</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;    <span class="comment">// Saves results in pCtx-&gt;res.</span></div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;    <span class="keywordtype">void</span> Defragment(</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;        VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;        VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;        VkCommandBuffer commandBuffer);</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;    <span class="keywordtype">void</span> DefragmentationEnd(</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;    <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;    <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;    VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;    <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</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="keyword">private</span>:</div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;    VMA_RW_MUTEX m_Mutex;</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;    uint32_t m_NextBlockId;</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;</div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</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="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</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="l06067"></a><span class="lineno"> 6067</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</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;    VkResult AllocatePage(</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</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="l06075"></a><span class="lineno"> 6075</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;    VkResult AllocateFromBlock(</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;</div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves);</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;        VkCommandBuffer commandBuffer);</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;    <span class="comment">/*</span></div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;<span class="comment">    Used during defragmentation. pDefragmentationStats is optional. It&#39;s in/out</span></div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;<span class="comment">    - updated with new data.</span></div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</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;</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;<span class="keyword">struct </span>VmaPool_T</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;    VMA_CLASS_NO_COPY(VmaPool_T)</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;    VmaBlockVector m_BlockVector;</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;    VmaPool_T(</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</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="l06118"></a><span class="lineno"> 6118</span>&#160;        VkDeviceSize preferredBlockSize);</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;    ~VmaPool_T();</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;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</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="l06123"></a><span class="lineno"> 6123</span>&#160;</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;<span class="preprocessor">#endif</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;<span class="keyword">private</span>:</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;};</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;<span class="comment">Performs defragmentation:</span></div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;<span class="comment"></span></div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;<span class="comment">- Updates `pBlockVector-&gt;m_pMetadata`.</span></div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;<span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;<span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm</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;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;    VmaDefragmentationAlgorithm(</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;        uint32_t currentFrameIndex) :</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;        m_hAllocator(hAllocator),</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;        m_pBlockVector(pBlockVector),</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;        m_CurrentFrameIndex(currentFrameIndex)</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    {</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;    }</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</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;</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</div><div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;</div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;        uint32_t maxAllocationsToMove) = 0;</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</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="keyword">protected</span>:</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;    {</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;            m_pChanged(VMA_NULL)</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;        {</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;        AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;            m_hAllocation(hAlloc),</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;            m_pChanged(pChanged)</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;        {</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;        }</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;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;{</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    VmaDefragmentationAlgorithm_Generic(</div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</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;    <span class="keyword">virtual</span> <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="l06202"></a><span class="lineno"> 6202</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;        uint32_t maxAllocationsToMove);</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="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</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;<span class="keyword">private</span>:</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;    uint32_t m_AllocationCount;</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</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;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;    {</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;        <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="l06222"></a><span class="lineno"> 6222</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;        }</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;    };</div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;    <span class="keyword">struct </span>AllocationInfoOffsetGreater</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;    {</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;        <span class="keywordtype">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="l06230"></a><span class="lineno"> 6230</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetOffset() &gt; rhs.m_hAllocation-&gt;GetOffset();</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;</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;    {</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;        <span class="keywordtype">size_t</span> m_OriginalBlockIndex;</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;            m_OriginalBlockIndex(SIZE_MAX),</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;            m_Allocations(pAllocationCallbacks)</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;        }</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="keywordtype">void</span> CalcHasNonMovableAllocations()</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;            <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="l06253"></a><span class="lineno"> 6253</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</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;</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescending()</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;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        }</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</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;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</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;    };</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;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;    {</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;        <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="l06271"></a><span class="lineno"> 6271</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;        }</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;        <span class="keywordtype">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="l06275"></a><span class="lineno"> 6275</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;        }</div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;    };</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;    {</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;        <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="l06285"></a><span class="lineno"> 6285</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</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">return</span> <span class="keyword">true</span>;</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="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</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;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;            <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="l06295"></a><span class="lineno"> 6295</span>&#160;            {</div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160;            }</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;        }</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;</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;    BlockInfoVector m_Blocks;</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;    VkResult DefragmentRound(</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;        uint32_t maxAllocationsToMove);</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;    <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</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;</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</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_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;    VmaDefragmentationAlgorithm_Fast(</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;</div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;        uint32_t maxAllocationsToMove);</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;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</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;<span class="keyword">private</span>:</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;    <span class="keyword">struct </span>BlockInfo</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="keywordtype">size_t</span> origBlockIndex;</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;</div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;    <span class="keyword">class </span>FreeSpaceDatabase</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;    {</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;        FreeSpaceDatabase()</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;            FreeSpace s = {};</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;            s.blockInfoIndex = SIZE_MAX;</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</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;                m_FreeSpaces[i] = s;</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="keywordtype">void</span> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;        {</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;            <span class="keywordflow">if</span>(size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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="keywordflow">return</span>;</div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;            }</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;            <span class="comment">// Find first invalid or the smallest structure.</span></div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;            {</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;                <span class="comment">// Empty structure.</span></div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</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;                    bestIndex = i;</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;                }</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].size &lt; size &amp;&amp;</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;                    (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size &gt; m_FreeSpaces[i].size))</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;                    bestIndex = i;</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;                }</div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;            }</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">if</span>(bestIndex != SIZE_MAX)</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;                m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;                m_FreeSpaces[bestIndex].offset = offset;</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;                m_FreeSpaces[bestIndex].size = size;</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;            }</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;        }</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;        <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;            <span class="keywordtype">size_t</span>&amp; outBlockInfoIndex, VkDeviceSize&amp; outDstOffset)</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="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;            VkDeviceSize bestFreeSpaceAfter = 0;</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;            {</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;                <span class="comment">// Structure is valid.</span></div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;                {</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;                    <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;                    <span class="comment">// Allocation fits into this structure.</span></div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;                    <span class="keywordflow">if</span>(dstOffset + size &lt;= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;                    {</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;                        <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;                            (dstOffset + size);</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;                        <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter &gt; bestFreeSpaceAfter)</div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;                        {</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;                            bestIndex = i;</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;                            bestFreeSpaceAfter = freeSpaceAfter;</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;                    }</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;                }</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;            }</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;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</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;                outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;                outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</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;                <span class="keywordflow">if</span>(bestFreeSpaceAfter &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;                {</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;                    <span class="comment">// Leave this structure for remaining empty space.</span></div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;                    <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;                    m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;                    m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;                }</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;                <span class="keywordflow">else</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;                    <span class="comment">// This structure becomes invalid.</span></div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;                    m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;                }</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;        }</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        <span class="keyword">struct </span>FreeSpace</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;        {</div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;            <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;            VkDeviceSize offset;</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;            VkDeviceSize size;</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;        } m_FreeSpaces[MAX_COUNT];</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;    };</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;</div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;</div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;    uint32_t m_AllocationCount;</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</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;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt; m_BlockInfos;</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="keywordtype">void</span> PreprocessMetadata();</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;    <span class="keywordtype">void</span> PostprocessMetadata();</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;    <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc);</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;</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;<span class="keyword">struct </span>VmaBlockDefragmentationContext</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;    <span class="keyword">enum</span> BLOCK_FLAG</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;        BLOCK_FLAG_USED = 0x00000001,</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;    uint32_t flags;</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;    VkBuffer hBuffer;</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;</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;<span class="keyword">class </span>VmaBlockVectorDefragmentationContext</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;{</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;    VkResult res;</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;    <span class="keywordtype">bool</span> mutexLocked;</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;    VmaVector&lt; VmaBlockDefragmentationContext, VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt; &gt; blockContexts;</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;    VmaBlockVectorDefragmentationContext(</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;        uint32_t currFrameIndex);</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;    ~VmaBlockVectorDefragmentationContext();</div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;    VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</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">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;    <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;</div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;    <span class="keywordtype">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported);</div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</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="l06501"></a><span class="lineno"> 6501</span>&#160;    <span class="comment">// Null if not from custom pool.</span></div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;    <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool-&gt;m_BlockVector or m_hAllocator-&gt;m_pBlockVectors.</span></div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;    <span class="comment">// Owner of this object.</span></div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;    VmaDefragmentationAlgorithm* m_pAlgorithm;</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;</div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;    <span class="keyword">struct </span>AllocInfo</div><div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;    {</div><div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;        VkBool32* pChanged;</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="comment">// Used between constructor and Begin.</span></div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;    VmaVector&lt; AllocInfo, VmaStlAllocator&lt;AllocInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;};</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;</div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;<span class="keyword">struct </span>VmaDefragmentationContext_T</div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;{</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;    VmaDefragmentationContext_T(</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;        uint32_t currFrameIndex,</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;        uint32_t flags,</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;    ~VmaDefragmentationContext_T();</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> AddPools(uint32_t poolCount, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    <span class="keywordtype">void</span> AddAllocations(</div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;        uint32_t allocationCount,</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;        VkBool32* pAllocationsChanged);</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;    <span class="comment">/*</span></div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;<span class="comment">    Returns:</span></div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;<span class="comment">    - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;<span class="comment">    - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;<span class="comment">    - Negative value if error occured and object can be destroyed immediately.</span></div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;        VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;        VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;        VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</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="l06550"></a><span class="lineno"> 6550</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;    <span class="keyword">const</span> uint32_t m_Flags;</div><div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;    <span class="comment">// Owner of these objects.</span></div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;    VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;    <span class="comment">// Owner of these objects.</span></div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;    VmaVector&lt; VmaBlockVectorDefragmentationContext*, VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt; &gt; m_CustomPoolContexts;</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;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;</div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;<span class="keyword">class </span>VmaRecorder</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="keyword">public</span>:</div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;    VmaRecorder();</div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</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="l06566"></a><span class="lineno"> 6566</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled);</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;    ~VmaRecorder();</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;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</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="l06577"></a><span class="lineno"> 6577</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</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="l06579"></a><span class="lineno"> 6579</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</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="l06582"></a><span class="lineno"> 6582</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</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="l06586"></a><span class="lineno"> 6586</span>&#160;        uint64_t allocationCount,</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</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="l06593"></a><span class="lineno"> 6593</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</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="l06599"></a><span class="lineno"> 6599</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;        uint64_t allocationCount,</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div><div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</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="l06621"></a><span class="lineno"> 6621</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</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="l06625"></a><span class="lineno"> 6625</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</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="l06638"></a><span class="lineno"> 6638</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;    <span class="keyword">struct </span>CallParams</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;    {</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;        uint32_t threadId;</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;        <span class="keywordtype">double</span> time;</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;    };</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;    <span class="keyword">class </span>UserDataString</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="keyword">public</span>:</div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</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="l06653"></a><span class="lineno"> 6653</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="l06654"></a><span class="lineno"> 6654</span>&#160;</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</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;</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;    FILE* m_File;</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;    VMA_MUTEX m_FileMutex;</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;    int64_t m_Freq;</div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;    int64_t m_StartCounter;</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="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</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="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</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;        <span class="keywordflow">if</span>(count)</div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;        {</div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;            <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</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;                fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</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;        }</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;    }</div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;</div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;    <span class="keywordtype">void</span> Flush();</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;</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</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;<span class="comment">/*</span></div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;<span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;<span class="keyword">class </span>VmaAllocationObjectAllocator</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;    VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate();</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;    <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;    VmaPoolAllocator&lt;VmaAllocation_T&gt; m_Allocator;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;};</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;</div><div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;{</div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBindMemory2;</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;    VmaAllocationObjectAllocator m_AllocationObjectAllocator;</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="comment">// Number of bytes free out of limit, or VK_WHOLE_SIZE if no limit for that heap.</span></div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</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;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;    VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</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="l06736"></a><span class="lineno"> 6736</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="l06737"></a><span class="lineno"> 6737</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</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;    <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="l06744"></a><span class="lineno"> 6744</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;    }</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</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;</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</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;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    }</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</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="l06767"></a><span class="lineno"> 6767</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    }</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</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">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;    }</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;        VkImage hImage,</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</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;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</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="l06805"></a><span class="lineno"> 6805</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</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="comment">// Main deallocation function.</span></div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;    <span class="keywordtype">void</span> FreeMemory(</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</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;    VkResult ResizeAllocation(</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;        VkDeviceSize newSize);</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="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;    VkResult DefragmentationBegin(</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</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="l06826"></a><span class="lineno"> 6826</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;    VkResult DefragmentationEnd(</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</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;    <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="l06832"></a><span class="lineno"> 6832</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="l06833"></a><span class="lineno"> 6833</span>&#160;</div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</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="l06835"></a><span class="lineno"> 6835</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="l06836"></a><span class="lineno"> 6836</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="l06837"></a><span class="lineno"> 6837</span>&#160;</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</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;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</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;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;    <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;    <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;    <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;    VkResult BindVulkanBuffer(</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;        VkDeviceMemory memory,</div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;        VkDeviceSize memoryOffset,</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;        VkBuffer buffer,</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;    <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;    VkResult BindVulkanImage(</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;        VkDeviceMemory memory,</div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;        VkDeviceSize memoryOffset,</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;        VkImage image,</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</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;    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="l06867"></a><span class="lineno"> 6867</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="l06868"></a><span class="lineno"> 6868</span>&#160;</div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;        VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;        VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;        VkImage hImage,</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;</div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;        VMA_CACHE_OPERATION op);</div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;</div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;    <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="l06886"></a><span class="lineno"> 6886</span>&#160;</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;<span class="comment">    Returns bit mask of memory types that can support defragmentation on GPU as</span></div><div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;<span class="comment">    they support creation of required buffer for copy operations.</span></div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;    uint32_t GetGpuDefragmentationMemoryTypeBits();</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="keyword">private</span>:</div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</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;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;    VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;    </div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;    VMA_RW_MUTEX m_PoolsMutex;</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;    uint32_t m_NextPoolId;</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;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;</div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;    VmaRecorder* m_pRecorder;</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;<span class="preprocessor">#endif</span></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="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="l06912"></a><span class="lineno"> 6912</span>&#160;</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</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;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</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="l06922"></a><span class="lineno"> 6922</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;</div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;    <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;    VkResult AllocateDedicatedMemoryPage(</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;        <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div><div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;</div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;<span class="comment">    Calculates and returns bit mask of memory types that can support defragmentation</span></div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;<span class="comment">    on GPU as they support creation of required buffer for copy operations.</span></div><div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;    uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;};</div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160;</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;<span class="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="l06964"></a><span class="lineno"> 6964</span>&#160;{</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;}</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;</div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;<span class="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="l06969"></a><span class="lineno"> 6969</span>&#160;{</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</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;</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</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="l06975"></a><span class="lineno"> 6975</span>&#160;{</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</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="l06977"></a><span class="lineno"> 6977</span>&#160;}</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;</div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</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="l06981"></a><span class="lineno"> 6981</span>&#160;{</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</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="l06987"></a><span class="lineno"> 6987</span>&#160;{</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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;        ptr-&gt;~T();</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;        VmaFree(hAllocator, ptr);</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;</div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</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="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>(ptr != VMA_NULL)</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;    }</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;}</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;<span class="comment">// VmaStringBuilder</span></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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;{</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</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="l07015"></a><span class="lineno"> 7015</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="l07016"></a><span class="lineno"> 7016</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="l07017"></a><span class="lineno"> 7017</span>&#160;</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</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="l07019"></a><span class="lineno"> 7019</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="l07020"></a><span class="lineno"> 7020</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</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="l07024"></a><span class="lineno"> 7024</span>&#160;</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</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;</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</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="l07030"></a><span class="lineno"> 7030</span>&#160;{</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    {</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;    }</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;}</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;{</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;    Add(buf);</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;}</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;{</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;    Add(buf);</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="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</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="keywordtype">char</span> buf[21];</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;    Add(buf);</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;}</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;<span class="comment">// VmaJsonWriter</span></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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;{</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;    ~VmaJsonWriter();</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</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="l07076"></a><span class="lineno"> 7076</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;    </div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;    <span class="keywordtype">void</span> EndArray();</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;    </div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</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="l07082"></a><span class="lineno"> 7082</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="l07083"></a><span class="lineno"> 7083</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="l07084"></a><span class="lineno"> 7084</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</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="l07087"></a><span class="lineno"> 7087</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="l07088"></a><span class="lineno"> 7088</span>&#160;    </div><div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;    <span class="keywordtype">void</span> WriteNull();</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="keyword">private</span>:</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</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="l07096"></a><span class="lineno"> 7096</span>&#160;</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</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;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;        COLLECTION_TYPE_ARRAY,</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;    <span class="keyword">struct </span>StackItem</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;        COLLECTION_TYPE type;</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</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;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</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="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</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="l07115"></a><span class="lineno"> 7115</span>&#160;};</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</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="l07118"></a><span class="lineno"> 7118</span>&#160;</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;    m_SB(sb),</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;    m_InsideString(false)</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;}</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;VmaJsonWriter::~VmaJsonWriter()</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_ASSERT(!m_InsideString);</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;}</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;</div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;    StackItem item;</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;}</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</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;    VMA_ASSERT(!m_InsideString);</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;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</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;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;    m_Stack.pop_back();</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="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</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;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;    StackItem item;</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;}</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;</div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;    m_Stack.pop_back();</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;</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</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="l07183"></a><span class="lineno"> 7183</span>&#160;{</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;    EndString();</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;}</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;</div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;{</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</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="l07196"></a><span class="lineno"> 7196</span>&#160;    {</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;        ContinueString(pStr);</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;}</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</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="l07207"></a><span class="lineno"> 7207</span>&#160;    {</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;        {</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;        }</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</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="l07214"></a><span class="lineno"> 7214</span>&#160;        {</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</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;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;        {</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;            m_SB.Add(ch);</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;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</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">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;            <span class="keywordflow">break</span>;</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;}</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="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;{</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;}</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;{</div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;    m_SB.AddNumber(n);</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;<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="l07258"></a><span class="lineno"> 7258</span>&#160;{</div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;    m_SB.AddPointer(ptr);</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;</div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</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="l07264"></a><span class="lineno"> 7264</span>&#160;{</div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</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="l07267"></a><span class="lineno"> 7267</span>&#160;    {</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;    }</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;    m_InsideString = <span class="keyword">false</span>;</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;</div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;}</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;    m_SB.AddNumber(n);</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;</div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;{</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</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="l07293"></a><span class="lineno"> 7293</span>&#160;}</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="keywordtype">void</span> VmaJsonWriter::WriteNull()</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;}</div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;</div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;{</div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</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;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;            currItem.valueCount % 2 == 0)</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;        {</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;            VMA_ASSERT(isString);</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;</div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;            currItem.valueCount % 2 != 0)</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;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;        }</div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;        {</div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;            WriteIndent();</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;        {</div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;            WriteIndent();</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;        ++currItem.valueCount;</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;</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</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="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</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;        m_SB.AddNewLine();</div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;        </div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</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;            --count;</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;        }</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</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;            m_SB.Add(INDENT);</div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;        }</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;</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</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="l07354"></a><span class="lineno"> 7354</span>&#160;{</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;    {</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;</div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;        {</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;            <span class="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="l07364"></a><span class="lineno"> 7364</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</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="l07366"></a><span class="lineno"> 7366</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;        }</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;    }</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;    {</div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;    }</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;</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;{</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;</div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</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;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;    }</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;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;    m_BlockAllocation.m_Offset = offset;</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;</div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</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;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;    m_BlockAllocation.m_Offset = newOffset;</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;</div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;    }</div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;}</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;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;    {</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    }</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;</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</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;}</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;        {</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</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">else</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;            <span class="keywordflow">return</span> VMA_NULL;</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="keywordflow">break</span>;</div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;    }</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;</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;    }</div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;}</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="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;    <span class="keywordflow">for</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;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;        {</div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</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">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></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="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;            {</div><div class="line"><a name="l07509"></a><span class="lineno"> 7509</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="l07510"></a><span class="lineno"> 7510</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</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;    }</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</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="l07521"></a><span class="lineno"> 7521</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;};</div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</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="l07530"></a><span class="lineno"> 7530</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</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;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    json.WriteNumber(m_Size);</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">if</span>(m_pUserData != VMA_NULL)</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;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</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;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</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;            json.BeginString();</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;            json.EndString();</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;    }</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;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</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;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</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;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;    {</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;        json.WriteNumber(m_BufferImageUsage);</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;}</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;</div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;<span class="preprocessor">#endif</span></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;<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="l07568"></a><span class="lineno"> 7568</span>&#160;{</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;    {</div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</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="l07573"></a><span class="lineno"> 7573</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;    }</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;}</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;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;{</div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    {</div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;        ++m_MapCount;</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;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</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;</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;    }</div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</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;}</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;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="l07608"></a><span class="lineno"> 7608</span>&#160;{</div><div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</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;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;        }</div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;        <span class="keywordflow">else</span></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;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;        }</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;    }</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;    {</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;            ppData);</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;        {</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;            m_MapCount = 1;</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">return</span> result;</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;    }</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;}</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;</div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</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;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;                m_DedicatedAllocation.m_hMemory);</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;    <span class="keywordflow">else</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;    }</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;}</div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;</div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</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;<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="l07668"></a><span class="lineno"> 7668</span>&#160;{</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</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;    <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="l07687"></a><span class="lineno"> 7687</span>&#160;    {</div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;        json.EndObject();</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;</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</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="l07700"></a><span class="lineno"> 7700</span>&#160;    {</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;        json.EndObject();</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;    }</div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;</div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</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="keywordtype">bool</span> operator()(</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</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;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    }</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;</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;</div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;<span class="comment">// class VmaBlockMetadata</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;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;    m_Size(0),</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</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;}</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;    VkDeviceSize unusedBytes,</div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;    json.WriteNumber(GetSize());</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;    json.WriteNumber(unusedBytes);</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;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</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;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;    json.BeginArray();</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;</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</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;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;    json.WriteNumber(offset);</div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;</div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;    hAllocation-&gt;PrintParameters(json);</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;    json.EndObject();</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;}</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;</div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;        </div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;    json.WriteNumber(offset);</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;</div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;</div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;    json.WriteNumber(size);</div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</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="l07801"></a><span class="lineno"> 7801</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;    json.EndArray();</div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</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;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;{</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;}</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;</div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;{</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;}</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</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;    m_FreeCount = 1;</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;    m_SumFreeSize = size;</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;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</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;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;    --suballocItem;</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</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;</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</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;    <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</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">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;        ++suballocItem)</div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;    {</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</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;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</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;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</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;        VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</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="keywordflow">if</span>(currFree)</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;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;            {</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;                ++freeSuballocationsToRegister;</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;</div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</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="l07885"></a><span class="lineno"> 7885</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;        {</div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;</div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</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;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;        prevFree = currFree;</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="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</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;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</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="l07906"></a><span class="lineno"> 7906</span>&#160;    {</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</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="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;        lastSize = suballocItem-&gt;size;</div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;    }</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;}</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;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</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="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;    }</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;    {</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;    }</div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;}</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;}</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;</div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</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="l07944"></a><span class="lineno"> 7944</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;    </div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</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="l07953"></a><span class="lineno"> 7953</span>&#160;</div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;        ++suballocItem)</div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;    {</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;        {</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;            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="l07967"></a><span class="lineno"> 7967</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="l07968"></a><span class="lineno"> 7968</span>&#160;        }</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;        {</div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</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="l07972"></a><span class="lineno"> 7972</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="l07973"></a><span class="lineno"> 7973</span>&#160;        }</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;    }</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;}</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;</div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</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="l07978"></a><span class="lineno"> 7978</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;</div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</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="l07986"></a><span class="lineno"> 7986</span>&#160;}</div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="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="l07991"></a><span class="lineno"> 7991</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;    PrintDetailedMap_Begin(json,</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;        m_Suballocations.size() - (size_t)m_FreeCount, <span class="comment">// allocationCount</span></div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;        ++suballocItem, ++i)</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="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;        {</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;size);</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;        }</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;        <span class="keywordflow">else</span></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;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</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;    }</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;</div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;    PrintDetailedMap_End(json);</div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;}</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;</div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;{</div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;    VMA_ASSERT(!upperAddress);</div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;</div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;    pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</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="l08038"></a><span class="lineno"> 8038</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;    }</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></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> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</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;        <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="l08049"></a><span class="lineno"> 8049</span>&#160;        {</div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</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="l08051"></a><span class="lineno"> 8051</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</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>(CheckAllocation(</div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;                    allocSize,</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;                    allocAlignment,</div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;                    allocType,</div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;                {</div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;                }</div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;            }</div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;        }</div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_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="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;                it != m_Suballocations.end();</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;                ++it)</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;            {</div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp; CheckAllocation(</div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;                    allocSize,</div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;                    allocAlignment,</div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;                    allocType,</div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;                    it,</div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = it;</div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</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;            }</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">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></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="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</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="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;                    allocSize,</div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;                    allocAlignment,</div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;                    allocType,</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;                }</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;            }</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;        }</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;    }</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="keywordflow">if</span>(canMakeOtherLost)</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">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;</div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;        <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;        tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;            ++suballocIt)</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;        {</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;            {</div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;                    allocSize,</div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;                    allocAlignment,</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;                    allocType,</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;                    suballocIt,</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;                {</div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;                    <span class="keywordflow">if</span>(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="l08158"></a><span class="lineno"> 8158</span>&#160;                    {</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;                        <span class="keywordflow">break</span>;</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="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;                    {</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;                        found = <span class="keyword">true</span>;</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;                    }</div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;                }</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">return</span> found;</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;    }</div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;}</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(pAllocationRequest &amp;&amp; pAllocationRequest-&gt;type == VmaAllocationRequestType::Normal);</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</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="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            ++pAllocationRequest-&gt;item;</div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;        }</div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;        {</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</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;        <span class="keywordflow">else</span></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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;        }</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;    }</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;    </div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;}</div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;</div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;{</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;        ++it)</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;    {</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            it = FreeSuballocation(it);</div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;            ++lostAllocationCount;</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;    <span class="keywordflow">return</span> lostAllocationCount;</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;</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</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="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;        ++it)</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;    {</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;        {</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;        }</div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;    }</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;}</div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;</div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</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;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;    UnregisterFreeSuballocation(request.item);</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;    suballoc.offset = request.offset;</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;    suballoc.hAllocation = hAllocation;</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">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</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;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;        ++next;</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;    }</div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;</div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</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="l08296"></a><span class="lineno"> 8296</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</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;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;    }</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;</div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</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;        ++m_FreeCount;</div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;    }</div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;    {</div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;    }</div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    m_SumFreeSize -= allocSize;</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;</div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</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="l08321"></a><span class="lineno"> 8321</span>&#160;{</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;        {</div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;            <span class="keywordflow">return</span>;</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;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;}</div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;</div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</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="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;        ++suballocItem)</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;    {</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</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;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;            <span class="keywordflow">return</span>;</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;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;}</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">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</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="l08357"></a><span class="lineno"> 8357</span>&#160;    {</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</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;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;        lastSize = it-&gt;size;</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="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;}</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="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;    </div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;    *pSumItemSize = 0;</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="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;    {</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            *pSumFreeSize = suballocItem-&gt;size;</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;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</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="keywordflow">else</span></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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;            }</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;        }</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;        {</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</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;</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;    </div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;        {</div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</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">// Apply alignment.</span></div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;        {</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;            {</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;                {</div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;                    }</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;                }</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;            {</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;            }</div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;        }</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;    </div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</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="l08459"></a><span class="lineno"> 8459</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;        }</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;    </div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</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;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;        {</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;        }</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;</div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</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;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</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;                ++lastSuballocItem;</div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;                {</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;                }</div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;                    *pSumFreeSize += lastSuballocItem-&gt;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;                <span class="keywordflow">else</span></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;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</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">else</span></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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;                    }</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;                }</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;            }</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;        }</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;                    {</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;                        }</div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;                        <span class="keywordflow">else</span></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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;                        }</div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;                    }</div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;                }</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="comment">// Already on next page.</span></div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;                    <span class="keywordflow">break</span>;</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;                ++nextSuballocItem;</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;            }</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;        }</div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;    }</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;    {</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</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;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;        }</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        *pOffset = suballoc.offset;</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">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            *pOffset += VMA_DEBUG_MARGIN;</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;    </div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    </div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</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;                --prevSuballocItem;</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;            {</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</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;    </div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</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">// Calculate required margin at the end.</span></div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</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="l08607"></a><span class="lineno"> 8607</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;        {</div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;        }</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;</div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</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;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;                    {</div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;                    }</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;                }</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;                    <span class="keywordflow">break</span>;</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;                ++nextSuballocItem;</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;            }</div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;        }</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;    }</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">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;{</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;    ++nextItem;</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;}</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</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">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</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">// Update totals.</span></div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;    m_SumFreeSize += suballoc.size;</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;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;    </div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;    ++nextItem;</div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</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="l08675"></a><span class="lineno"> 8675</span>&#160;    {</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div><div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160;    }</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;    {</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;        --prevItem;</div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;        {</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;        }</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;    }</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;    {</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;        MergeFreeWithNext(suballocItem);</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;</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</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;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;    }</div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;    {</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;        <span class="keywordflow">return</span> suballocItem;</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;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</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;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</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;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;        }</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;        {</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</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;</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;}</div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;{</div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</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">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;            item,</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;            ++index)</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>(m_FreeSuballocationsBySize[index] == item)</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;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;                <span class="keywordflow">return</span>;</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;            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="l08760"></a><span class="lineno"> 8760</span>&#160;        }</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</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;</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></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="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;    VmaSuballocationType&amp; inOutPrevSuballocType)<span class="keyword"> const</span></div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</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">return</span> <span class="keyword">false</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;    VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;    <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;        it != m_Suballocations.cend();</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;        ++it)</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;        <span class="keyword">const</span> VmaSuballocationType suballocType = it-&gt;type;</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;        <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</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;            minAlignment = VMA_MIN(minAlignment, it-&gt;hAllocation-&gt;GetAlignment());</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</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;                typeConflictFound = <span class="keyword">true</span>;</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;            inOutPrevSuballocType = suballocType;</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;    }</div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;    <span class="keywordflow">return</span> typeConflictFound || minAlignment &gt;= bufferImageGranularity;</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;}</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;    m_1stVectorIndex(0),</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;    m_1stNullItemsBeginCount(0),</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;    m_1stNullItemsMiddleCount(0),</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;    m_2ndNullItemsCount(0)</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;}</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;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</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;}</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="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;}</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;        suballocations2nd.empty() ||</div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</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;        <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;    }</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</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="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</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;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</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;    VkDeviceSize sumUsedSize = 0;</div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</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="l08858"></a><span class="lineno"> 8858</span>&#160;        {</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</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="l08861"></a><span class="lineno"> 8861</span>&#160;</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</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="keywordflow">if</span>(!currFree)</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;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;                sumUsedSize += suballoc.size;</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="keywordflow">else</span></div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;            {</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;                ++nullItem2ndCount;</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;</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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;</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</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="l08883"></a><span class="lineno"> 8883</span>&#160;    {</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;    }</div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;</div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;    <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</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">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</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="l08895"></a><span class="lineno"> 8895</span>&#160;</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</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>(!currFree)</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;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;            sumUsedSize += suballoc.size;</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;        {</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;            ++nullItem1stCount;</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;</div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;    }</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;        {</div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</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="l08923"></a><span class="lineno"> 8923</span>&#160;</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;            {</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;                sumUsedSize += suballoc.size;</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;            <span class="keywordflow">else</span></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;                ++nullItem2ndCount;</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;</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;    }</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;</div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;    VMA_VALIDATE(offset &lt;= GetSize());</div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;}</div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;</div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;<span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;}</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;</div><div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</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">/*</span></div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</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="l08962"></a><span class="lineno"> 8962</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="l08963"></a><span class="lineno"> 8963</span>&#160;<span class="comment">    is available for new allocations.</span></div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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="keywordflow">return</span> size;</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;    }</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;    </div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</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">switch</span>(m_2ndVectorMode)</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="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</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="l08977"></a><span class="lineno"> 8977</span>&#160;<span class="comment">        whould make it a ring buffer).</span></div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;<span class="comment">        */</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="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;                firstSuballoc.offset,</div><div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.size));</div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;        }</div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;        <span class="keywordflow">break</span>;</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">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;<span class="comment">        */</span></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="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;        }</div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;        <span class="keywordflow">break</span>;</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">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;<span class="comment">        */</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;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</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">break</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;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</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;<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="l09021"></a><span class="lineno"> 9021</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</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;    VkDeviceSize lastOffset = 0;</div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;</div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;        {</div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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">// Found non-null allocation.</span></div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;            {</div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;            </div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</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="l09065"></a><span class="lineno"> 9065</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="l09066"></a><span class="lineno"> 9066</span>&#160;                }</div><div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;            </div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</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="l09072"></a><span class="lineno"> 9072</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="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">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;            {</div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;                {</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</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="l09088"></a><span class="lineno"> 9088</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="l09089"></a><span class="lineno"> 9089</span>&#160;               }</div><div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160;</div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;    }</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;</div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;        {</div><div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;        }</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;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;            </div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;            {</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</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="l09122"></a><span class="lineno"> 9122</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="l09123"></a><span class="lineno"> 9123</span>&#160;            }</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;            </div><div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</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="l09129"></a><span class="lineno"> 9129</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="l09130"></a><span class="lineno"> 9130</span>&#160;            </div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;        }</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160;        {</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;            {</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</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="l09145"></a><span class="lineno"> 9145</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="l09146"></a><span class="lineno"> 9146</span>&#160;           }</div><div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;            {</div><div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;                --nextAlloc2ndIndex;</div><div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;            }</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="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;            </div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09177"></a><span class="lineno"> 9177</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="l09178"></a><span class="lineno"> 9178</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="l09179"></a><span class="lineno"> 9179</span>&#160;                }</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;            </div><div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</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="l09185"></a><span class="lineno"> 9185</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="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">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;                --nextAlloc2ndIndex;</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">// We are at the end.</span></div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;            {</div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;                <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div><div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;                {</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</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="l09201"></a><span class="lineno"> 9201</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="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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;                lastOffset = size;</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;        }</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;    }</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;    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="l09211"></a><span class="lineno"> 9211</span>&#160;}</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;<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="l09214"></a><span class="lineno"> 9214</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</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;    VkDeviceSize lastOffset = 0;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160;    {</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;            {</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;                {</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</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="l09251"></a><span class="lineno"> 9251</span>&#160;                }</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;            </div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;                ++nextAlloc2ndIndex;</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">// We are at the end.</span></div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;            <span class="keywordflow">else</span></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="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</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="l09271"></a><span class="lineno"> 9271</span>&#160;                }</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;    }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;        {</div><div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</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="l09304"></a><span class="lineno"> 9304</span>&#160;            }</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="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;            </div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;        }</div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</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="l09324"></a><span class="lineno"> 9324</span>&#160;            }</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;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;</div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;        {</div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;            }</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="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;            </div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</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="l09356"></a><span class="lineno"> 9356</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;            <span class="keywordflow">else</span></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="keywordflow">if</span>(lastOffset &lt; size)</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="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</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="l09376"></a><span class="lineno"> 9376</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;                lastOffset = size;</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;        }</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;}</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</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="l09387"></a><span class="lineno"> 9387</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</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> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;    <span class="comment">// FIRST PASS</span></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;    <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;    VkDeviceSize usedBytes = 0;</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;    VkDeviceSize lastOffset = 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;    <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;        {</div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;                suballocations2nd[nextAlloc2ndIndex].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;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;            }</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;                }</div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;            </div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;                usedBytes += suballoc.size;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;            }</div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;            {</div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;            }</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;    }</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="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;        }</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;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;            </div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;            {</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;                ++unusedRangeCount;</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;            }</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">// 2. Process this allocation.</span></div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;            ++alloc1stCount;</div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;            usedBytes += suballoc.size;</div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;            </div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;            ++nextAlloc1stIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;                ++unusedRangeCount;</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;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;        {</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;            {</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;            </div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;                    ++unusedRangeCount;</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="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;                usedBytes += suballoc.size;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;            {</div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;                    ++unusedRangeCount;</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;</div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;                lastOffset = size;</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;        }</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="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div><div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;</div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;    <span class="comment">// SECOND PASS</span></div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;    lastOffset = 0;</div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;                {</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;            </div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;                ++nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;            <span class="keywordflow">else</span></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">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;            }</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;        }</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;</div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;        }</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;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;            </div><div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;            </div><div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;            </div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;            ++nextAlloc1stIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;        {</div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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="comment">// End of loop.</span></div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;        }</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;</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;    {</div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;        {</div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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="comment">// Found non-null allocation.</span></div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;            </div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;                {</div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;                }</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;            </div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;            </div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;            {</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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="comment">// End of loop.</span></div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;                lastOffset = size;</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;        }</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;    }</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;    PrintDetailedMap_End(json);</div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;}</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;    <span class="keywordflow">return</span> upperAddress ?</div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;        CreateAllocationRequest_UpperAddress(</div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;        CreateAllocationRequest_LowerAddress(</div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</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;</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;{</div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        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="l09745"></a><span class="lineno"> 9745</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; size)</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="keywordflow">return</span> <span class="keyword">false</span>;</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;    VkDeviceSize resultBaseOffset = size - allocSize;</div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</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="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;        resultBaseOffset = lastSuballoc.offset - allocSize;</div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</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="keywordflow">return</span> <span class="keyword">false</span>;</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;    }</div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;</div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;    <span class="comment">// Start from offset equal to end of free space.</span></div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;    VkDeviceSize resultOffset = resultBaseOffset;</div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;</div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;    <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;    {</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;        <span class="keywordflow">if</span>(resultOffset &lt; VMA_DEBUG_MARGIN)</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;        {</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;        }</div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;        resultOffset -= VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;    <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;    resultOffset = VmaAlignDown(resultOffset, allocAlignment);</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">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;    <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</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;        <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;            <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;            {</div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;                <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</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;                    bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;                    <span class="keywordflow">break</span>;</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;            }</div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;                <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;        }</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;        {</div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;            resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;        }</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;</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;    <span class="comment">// There is enough free space.</span></div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;    <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;        suballocations1st.back().offset + suballocations1st.back().size :</div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;        0;</div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;    <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</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">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;        {</div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</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;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;                    {</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;                    }</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;                {</div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;                }</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;</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;        <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;        pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;        pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;        pAllocationRequest-&gt;type = VmaAllocationRequestType::UpperAddress;</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;    }</div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;}</div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;</div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="comment">// Try to allocate at the end of 1st vector.</span></div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;</div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;        <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;        {</div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;        }</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="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;</div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            resultOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;        }</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">// Apply alignment.</span></div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;</div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations1st.empty())</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</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;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;                {</div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;                    }</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;                    <span class="keywordflow">break</span>;</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</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;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;            }</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;</div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;            suballocations2nd.back().offset : size;</div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;</div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;        <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</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;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;            {</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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;                    <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;                    {</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="keywordflow">else</span></div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;                    {</div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;                        <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;                    }</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;            }</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160;</div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;            <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;            pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf1st;</div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</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;    <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;    <span class="comment">// beginning of 1st vector as the end of free space.</span></div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        VMA_ASSERT(!suballocations1st.empty());</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;        VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;        {</div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;        }</div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;</div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;        <span class="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</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;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;        {</div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</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;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</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;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;        {</div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;                    }</div><div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;                }</div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">if</span>(bufferImageGranularityConflict)</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;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</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;        }</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;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;        <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</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">if</span>(canMakeOtherLost)</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;            <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div><div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</div><div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;            {</div><div class="line"><a name="l10010"></a><span class="lineno">10010</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="l10011"></a><span class="lineno">10011</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;                <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;                {</div><div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;                    <span class="comment">// No problem.</span></div><div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;                }</div><div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;                <span class="keywordflow">else</span></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;                    VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;                    <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;                        suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;                    {</div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;                        ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;                        pAllocationRequest-&gt;sumItemSize += suballoc.size;</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;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;                    {</div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;                    }</div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;                }</div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;                ++index1st;</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;            }</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;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;            <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;            {</div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;                <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</div><div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;                {</div><div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</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;                        <span class="keywordflow">if</span>(suballoc.hAllocation != 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;                            <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;                            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;                                suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                                ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;                                pAllocationRequest-&gt;sumItemSize += suballoc.size;</div><div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;                            }</div><div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;                            <span class="keywordflow">else</span></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> <span class="keyword">false</span>;</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;                    }</div><div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;                    <span class="keywordflow">else</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;                        <span class="comment">// Already on next page.</span></div><div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;                        <span class="keywordflow">break</span>;</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;                    ++index1st;</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;</div><div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;            <span class="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div><div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;            <span class="keywordflow">if</span>(index1st == suballocations1st.size() &amp;&amp;</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; size)</div><div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;            {</div><div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;                <span class="comment">// TODO: This is a known bug that it&#39;s not yet implemented and the allocation is failing.</span></div><div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost.&quot;</span>);</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;        }</div><div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;</div><div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l10076"></a><span class="lineno">10076</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="l10077"></a><span class="lineno">10077</span>&#160;            (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</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;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div><div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;                    nextSuballocIndex &lt; suballocations1st.size();</div><div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;                    nextSuballocIndex++)</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div><div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;                        }</div><div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;                    }</div><div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;                    {</div><div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;                        <span class="comment">// Already on next page.</span></div><div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;                    }</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;            }</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;            <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160;            pAllocationRequest-&gt;sumFreeSize =</div><div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;                (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div><div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;                - resultBaseOffset</div><div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;                - pAllocationRequest-&gt;sumItemSize;</div><div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf2nd;</div><div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div><div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</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> <span class="keyword">false</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div><div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</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;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</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;    <span class="comment">// We always start from 1st.</span></div><div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160;    SuballocationVectorType* suballocations = &amp;AccessSuballocations1st();</div><div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;    <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div><div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div><div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</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;        <span class="keywordflow">if</span>(index == suballocations-&gt;size())</div><div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;        {</div><div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;            index = 0;</div><div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;            <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div><div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;            <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;                suballocations = &amp;AccessSuballocations2nd();</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="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div><div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;            <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div><div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;            VMA_ASSERT(!suballocations-&gt;empty());</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;        VmaSuballocation&amp; suballoc = (*suballocations)[index];</div><div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</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;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;            {</div><div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;                m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;                <span class="keywordflow">if</span>(suballocations == &amp;AccessSuballocations1st())</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;                    ++m_1stNullItemsMiddleCount;</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;                {</div><div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;                    ++m_2ndNullItemsCount;</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;                ++madeLostCount;</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;            <span class="keywordflow">else</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">return</span> <span class="keyword">false</span>;</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;        }</div><div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;        ++index;</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;</div><div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;    CleanupAfterFree();</div><div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;{</div><div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;    </div><div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l10187"></a><span class="lineno">10187</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="l10188"></a><span class="lineno">10188</span>&#160;    {</div><div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;            m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;            ++lostAllocationCount;</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;    }</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;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10203"></a><span class="lineno">10203</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="l10204"></a><span class="lineno">10204</span>&#160;    {</div><div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;        {</div><div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10212"></a><span class="lineno">10212</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;            m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;            ++lostAllocationCount;</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;    }</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;    <span class="keywordflow">if</span>(lostAllocationCount)</div><div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160;    {</div><div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;        CleanupAfterFree();</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;</div><div class="line"><a name="l10223"></a><span class="lineno">10223</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l10224"></a><span class="lineno">10224</span>&#160;}</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;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160;{</div><div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l10229"></a><span class="lineno">10229</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="l10230"></a><span class="lineno">10230</span>&#160;    {</div><div class="line"><a name="l10231"></a><span class="lineno">10231</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l10232"></a><span class="lineno">10232</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;        {</div><div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10237"></a><span class="lineno">10237</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l10238"></a><span class="lineno">10238</span>&#160;            }</div><div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;    }</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;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10248"></a><span class="lineno">10248</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="l10249"></a><span class="lineno">10249</span>&#160;    {</div><div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;        {</div><div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</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(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;    }</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="keywordflow">return</span> VK_SUCCESS;</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;</div><div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div><div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;{</div><div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;    <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div><div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;</div><div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;    <span class="keywordflow">switch</span>(request.type)</div><div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;    {</div><div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::UpperAddress:</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;            VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div><div class="line"><a name="l10282"></a><span class="lineno">10282</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="l10283"></a><span class="lineno">10283</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;            suballocations2nd.push_back(newSuballoc);</div><div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div><div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;        }</div><div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div><div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;        {</div><div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</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;            VMA_ASSERT(suballocations1st.empty() ||</div><div class="line"><a name="l10293"></a><span class="lineno">10293</span>&#160;                request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size);</div><div class="line"><a name="l10294"></a><span class="lineno">10294</span>&#160;            <span class="comment">// Check if it fits before the end of the block.</span></div><div class="line"><a name="l10295"></a><span class="lineno">10295</span>&#160;            VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</div><div class="line"><a name="l10296"></a><span class="lineno">10296</span>&#160;</div><div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;            suballocations1st.push_back(newSuballoc);</div><div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;        }</div><div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</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;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l10303"></a><span class="lineno">10303</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="l10304"></a><span class="lineno">10304</span>&#160;            VMA_ASSERT(!suballocations1st.empty() &amp;&amp;</div><div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;                request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset);</div><div class="line"><a name="l10306"></a><span class="lineno">10306</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10307"></a><span class="lineno">10307</span>&#160;</div><div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;            <span class="keywordflow">switch</span>(m_2ndVectorMode)</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;            <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;                <span class="comment">// First allocation from second part ring buffer.</span></div><div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;                VMA_ASSERT(suballocations2nd.empty());</div><div class="line"><a name="l10313"></a><span class="lineno">10313</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div><div class="line"><a name="l10314"></a><span class="lineno">10314</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160;                <span class="comment">// 2-part ring buffer is already started.</span></div><div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;                VMA_ASSERT(!suballocations2nd.empty());</div><div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l10320"></a><span class="lineno">10320</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="l10321"></a><span class="lineno">10321</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;            }</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;            suballocations2nd.push_back(newSuballoc);</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;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</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;    m_SumFreeSize -= newSuballoc.size;</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;</div><div class="line"><a name="l10336"></a><span class="lineno">10336</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="l10337"></a><span class="lineno">10337</span>&#160;{</div><div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;    FreeAtOffset(allocation-&gt;GetOffset());</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;{</div><div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;</div><div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;    {</div><div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div><div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l10350"></a><span class="lineno">10350</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</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;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div><div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160;        }</div><div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;    }</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="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div><div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div><div class="line"><a name="l10363"></a><span class="lineno">10363</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</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;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160;        }</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;    <span class="comment">// Last allocation in 1st vector.</span></div><div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</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;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div><div class="line"><a name="l10379"></a><span class="lineno">10379</span>&#160;        {</div><div class="line"><a name="l10380"></a><span class="lineno">10380</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;            suballocations1st.pop_back();</div><div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;        }</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="comment">// Item from the middle of 1st vector.</span></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;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l10391"></a><span class="lineno">10391</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;        SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div><div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div><div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;            suballocations1st.end(),</div><div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;            refSuballoc,</div><div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;            VmaSuballocationOffsetLess());</div><div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div><div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;        {</div><div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div><div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;</div><div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</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;        <span class="comment">// Item from the middle of 2nd vector.</span></div><div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div><div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div><div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div><div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</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;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;        }</div><div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;    }</div><div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;</div><div class="line"><a name="l10428"></a><span class="lineno">10428</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="l10429"></a><span class="lineno">10429</span>&#160;}</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="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div><div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div><div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</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;</div><div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</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;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;</div><div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;    {</div><div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;        suballocations1st.clear();</div><div class="line"><a name="l10446"></a><span class="lineno">10446</span>&#160;        suballocations2nd.clear();</div><div class="line"><a name="l10447"></a><span class="lineno">10447</span>&#160;        m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;        m_1stNullItemsMiddleCount = 0;</div><div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;        m_2ndNullItemsCount = 0;</div><div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;    }</div><div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;    <span class="keywordflow">else</span></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="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div><div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;</div><div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div><div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;        {</div><div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;        }</div><div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;</div><div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;        <span class="comment">// Find more null items at the end of 1st vector.</span></div><div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;        {</div><div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;            suballocations1st.pop_back();</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;        <span class="comment">// Find more null items at the end of 2nd vector.</span></div><div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;        {</div><div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;            --m_2ndNullItemsCount;</div><div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;        }</div><div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;</div><div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;        <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div><div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;            suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;        {</div><div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;            --m_2ndNullItemsCount;</div><div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;            VmaVectorRemove(suballocations2nd, 0);</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;</div><div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;        <span class="keywordflow">if</span>(ShouldCompact1st())</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;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div><div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l10494"></a><span class="lineno">10494</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="l10495"></a><span class="lineno">10495</span>&#160;            {</div><div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;                {</div><div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;                    ++srcIndex;</div><div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;                }</div><div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;                <span class="keywordflow">if</span>(dstIndex != srcIndex)</div><div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;                {</div><div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</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;                ++srcIndex;</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;            suballocations1st.resize(nonNullItemCount);</div><div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;            m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;            m_1stNullItemsMiddleCount = 0;</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;        <span class="comment">// 2nd vector became empty.</span></div><div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</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;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</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;</div><div class="line"><a name="l10517"></a><span class="lineno">10517</span>&#160;        <span class="comment">// 1st vector became empty.</span></div><div class="line"><a name="l10518"></a><span class="lineno">10518</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</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;            suballocations1st.clear();</div><div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;            m_1stNullItemsBeginCount = 0;</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="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;            {</div><div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div><div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div><div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div><div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;                {</div><div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;                    ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;                    --m_1stNullItemsMiddleCount;</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;                m_2ndNullItemsCount = 0;</div><div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;                m_1stVectorIndex ^= 1;</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;</div><div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;    VMA_HEAVY_ASSERT(Validate());</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="l10545"></a><span class="lineno">10545</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</span></div><div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;</div><div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;    m_Root(VMA_NULL),</div><div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;    m_AllocationCount(0),</div><div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;    m_FreeCount(1),</div><div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;    m_SumFreeSize(0)</div><div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;{</div><div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div><div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;}</div><div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;</div><div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</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;    DeleteNode(m_Root);</div><div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</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;    m_UsableSize = VmaPrevPow2(size);</div><div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;    m_SumFreeSize = m_UsableSize;</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 m_LevelCount.</span></div><div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;    m_LevelCount = 1;</div><div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div><div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</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;        ++m_LevelCount;</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;</div><div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;    rootNode-&gt;offset = 0;</div><div class="line"><a name="l10579"></a><span class="lineno">10579</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div><div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</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;    m_Root = rootNode;</div><div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;    AddToFreeListFront(0, rootNode);</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;</div><div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;    <span class="comment">// Validate tree.</span></div><div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;    ValidationContext ctx;</div><div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</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;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div><div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;    }</div><div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div><div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</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="comment">// Validate free node lists.</span></div><div class="line"><a name="l10599"></a><span class="lineno">10599</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;    {</div><div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div><div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;</div><div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div><div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;            node != VMA_NULL;</div><div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;            node = node-&gt;free.next)</div><div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160;        {</div><div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;            </div><div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</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;                VMA_VALIDATE(m_FreeList[level].back == node);</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">else</span></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;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</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="comment">// Validate that free lists ar higher levels are empty.</span></div><div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div><div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;    {</div><div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</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;</div><div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l10628"></a><span class="lineno">10628</span>&#160;}</div><div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;</div><div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;    {</div><div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;        <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div><div class="line"><a name="l10635"></a><span class="lineno">10635</span>&#160;        {</div><div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;            <span class="keywordflow">return</span> LevelToNodeSize(level);</div><div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;        }</div><div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;    }</div><div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;    <span class="keywordflow">return</span> 0;</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;<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="l10643"></a><span class="lineno">10643</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;</div><div class="line"><a name="l10648"></a><span class="lineno">10648</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="l10649"></a><span class="lineno">10649</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="l10650"></a><span class="lineno">10650</span>&#160;</div><div class="line"><a name="l10651"></a><span class="lineno">10651</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="l10652"></a><span class="lineno">10652</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="l10653"></a><span class="lineno">10653</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="l10654"></a><span class="lineno">10654</span>&#160;</div><div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</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="keywordflow">if</span>(unusableSize &gt; 0)</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;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div><div class="line"><a name="l10661"></a><span class="lineno">10661</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="l10662"></a><span class="lineno">10662</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="l10663"></a><span class="lineno">10663</span>&#160;    }</div><div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;}</div><div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;</div><div class="line"><a name="l10666"></a><span class="lineno">10666</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="l10667"></a><span class="lineno">10667</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div><div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div><div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l10674"></a><span class="lineno">10674</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="l10675"></a><span class="lineno">10675</span>&#160;</div><div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;    {</div><div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l10679"></a><span class="lineno">10679</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="l10680"></a><span class="lineno">10680</span>&#160;    }</div><div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;}</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="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="l10686"></a><span class="lineno">10686</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;    <span class="comment">// TODO optimize</span></div><div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div><div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;    CalcAllocationStatInfo(stat);</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;    PrintDetailedMap_Begin(</div><div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160;        json,</div><div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div><div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div><div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160;</div><div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div><div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;</div><div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</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;        PrintDetailedMap_UnusedRange(json,</div><div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div><div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;            unusableSize); <span class="comment">// size</span></div><div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;    }</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;    PrintDetailedMap_End(json);</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;</div><div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;</div><div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div><div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    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="l10725"></a><span class="lineno">10725</span>&#160;</div><div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div><div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div><div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div><div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</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;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div><div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div><div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;    }</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;    <span class="keywordflow">if</span>(allocSize &gt; m_UsableSize)</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">return</span> <span class="keyword">false</span>;</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="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</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">for</span>(Node* freeNode = m_FreeList[level].front;</div><div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;            freeNode != VMA_NULL;</div><div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;            freeNode = freeNode-&gt;free.next)</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;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div><div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;            {</div><div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160;                pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div><div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div><div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div><div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div><div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l10757"></a><span class="lineno">10757</span>&#160;            }</div><div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160;        }</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;</div><div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div><div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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">/*</span></div><div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</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;</div><div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l10777"></a><span class="lineno">10777</span>&#160;{</div><div class="line"><a name="l10778"></a><span class="lineno">10778</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l10781"></a><span class="lineno">10781</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;    <span class="keywordflow">return</span> 0;</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="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div><div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;{</div><div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</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;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</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;    Node* currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</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;        currNode = currNode-&gt;free.next;</div><div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</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;    </div><div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div><div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</div><div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;    {</div><div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;        <span class="comment">// currNode is already first free node at currLevel.</span></div><div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div><div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;        RemoveFromFreeList(currLevel, currNode);</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="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</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="comment">// Create two free sub-nodes.</span></div><div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;</div><div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;        leftChild-&gt;offset = currNode-&gt;offset;</div><div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160;        leftChild-&gt;parent = currNode;</div><div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;        leftChild-&gt;buddy = rightChild;</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;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div><div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160;        rightChild-&gt;parent = currNode;</div><div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;        rightChild-&gt;buddy = leftChild;</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">// Convert current currNode to split type.</span></div><div class="line"><a name="l10828"></a><span class="lineno">10828</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div><div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;        currNode-&gt;split.leftChild = leftChild;</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;        <span class="comment">// Add child nodes to free list. Order is important!</span></div><div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div><div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</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;        ++m_FreeCount;</div><div class="line"><a name="l10836"></a><span class="lineno">10836</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="l10837"></a><span class="lineno">10837</span>&#160;        ++currLevel;</div><div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160;        currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;</div><div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l10841"></a><span class="lineno">10841</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="l10842"></a><span class="lineno">10842</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div><div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;    }</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;    <span class="comment">// Remove from free list.</span></div><div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div><div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;        currNode != VMA_NULL &amp;&amp;</div><div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;    RemoveFromFreeList(currLevel, currNode);</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;    <span class="comment">// Convert to allocation node.</span></div><div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div><div class="line"><a name="l10854"></a><span class="lineno">10854</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</div><div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160;</div><div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;    ++m_AllocationCount;</div><div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;}</div><div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;</div><div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</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;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</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;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div><div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;        DeleteNode(node-&gt;split.leftChild);</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;</div><div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</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;</div><div class="line"><a name="l10872"></a><span class="lineno">10872</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="l10873"></a><span class="lineno">10873</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div><div class="line"><a name="l10875"></a><span class="lineno">10875</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div><div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div><div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div><div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</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="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div><div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div><div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;        ++ctx.calculatedFreeCount;</div><div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;        ++ctx.calculatedAllocationCount;</div><div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div><div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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="keyword">const</span> uint32_t childrenLevel = level + 1;</div><div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div><div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div><div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div><div class="line"><a name="l10897"></a><span class="lineno">10897</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</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;                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="l10900"></a><span class="lineno">10900</span>&#160;            }</div><div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div><div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</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;                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="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;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div><div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10918"></a><span class="lineno">10918</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="l10919"></a><span class="lineno">10919</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div><div class="line"><a name="l10921"></a><span class="lineno">10921</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</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;        ++level;</div><div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div><div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;    }</div><div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;    <span class="keywordflow">return</span> level;</div><div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;}</div><div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;</div><div class="line"><a name="l10931"></a><span class="lineno">10931</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="l10932"></a><span class="lineno">10932</span>&#160;{</div><div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160;    <span class="comment">// Find node and level.</span></div><div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;    Node* node = m_Root;</div><div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;    VkDeviceSize nodeOffset = 0;</div><div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div><div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</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;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</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;            node = node-&gt;split.leftChild;</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;        {</div><div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;            node = node-&gt;split.leftChild-&gt;buddy;</div><div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;            nodeOffset += nextLevelSize;</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;        ++level;</div><div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;        levelNodeSize = nextLevelSize;</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;</div><div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div><div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div><div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;</div><div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;    --m_AllocationCount;</div><div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div><div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;</div><div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;    node-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160;</div><div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;    <span class="comment">// Join free nodes if possible.</span></div><div class="line"><a name="l10964"></a><span class="lineno">10964</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="l10965"></a><span class="lineno">10965</span>&#160;    {</div><div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div><div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</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;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div><div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div><div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</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;        node = parent;</div><div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160;        --level;</div><div class="line"><a name="l10975"></a><span class="lineno">10975</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="l10976"></a><span class="lineno">10976</span>&#160;        --m_FreeCount;</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;</div><div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;    AddToFreeListFront(level, node);</div><div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;}</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;<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="l10983"></a><span class="lineno">10983</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</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;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div><div class="line"><a name="l10989"></a><span class="lineno">10989</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="l10990"></a><span class="lineno">10990</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="l10991"></a><span class="lineno">10991</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</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;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div><div class="line"><a name="l10997"></a><span class="lineno">10997</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="l10998"></a><span class="lineno">10998</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="l10999"></a><span class="lineno">10999</span>&#160;</div><div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div><div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 0)</div><div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;            {</div><div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l11005"></a><span class="lineno">11005</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="l11006"></a><span class="lineno">11006</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="l11007"></a><span class="lineno">11007</span>&#160;            }</div><div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;        }</div><div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div><div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</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="keywordflow">break</span>;</div><div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;        VMA_ASSERT(0);</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;}</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="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</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;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</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;    <span class="comment">// List is empty.</span></div><div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div><div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div><div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div><div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</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;    <span class="keywordflow">else</span></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;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;        node-&gt;free.prev = VMA_NULL;</div><div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160;        node-&gt;free.next = frontNode;</div><div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;        frontNode-&gt;free.prev = node;</div><div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;        m_FreeList[level].front = node;</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;}</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="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</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;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</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;    <span class="comment">// It is at the front.</span></div><div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].front == node);</div><div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</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="keywordflow">else</span></div><div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;    {</div><div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div><div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div><div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</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;</div><div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;    <span class="comment">// It is at the back.</span></div><div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].back == node);</div><div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div><div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;    }</div><div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160;    <span class="keywordflow">else</span></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;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div><div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div><div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</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;}</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11078"></a><span class="lineno">11078</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="l11079"></a><span class="lineno">11079</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</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">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div><div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</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;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div><div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</div><div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;            {</div><div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</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="keywordflow">break</span>;</div><div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div><div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</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">break</span>;</div><div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;        VMA_ASSERT(0);</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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="l11112"></a><span class="lineno">11112</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></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;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    m_pMetadata(VMA_NULL),</div><div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;    m_Id(0),</div><div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;    m_pMappedData(VMA_NULL)</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;}</div><div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;</div><div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div><div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;    VkDeviceSize newSize,</div><div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;    uint32_t algorithm)</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;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</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;    m_hParentPool = hParentPool;</div><div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160;    m_Id = id;</div><div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;    m_hMemory = newMemory;</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">switch</span>(algorithm)</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="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="l11143"></a><span class="lineno">11143</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div><div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11145"></a><span class="lineno">11145</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="l11146"></a><span class="lineno">11146</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div><div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11148"></a><span class="lineno">11148</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l11149"></a><span class="lineno">11149</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l11150"></a><span class="lineno">11150</span>&#160;        <span class="comment">// Fall-through.</span></div><div class="line"><a name="l11151"></a><span class="lineno">11151</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l11152"></a><span class="lineno">11152</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</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;    m_pMetadata-&gt;Init(newSize);</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;</div><div class="line"><a name="l11157"></a><span class="lineno">11157</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="l11158"></a><span class="lineno">11158</span>&#160;{</div><div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l11161"></a><span class="lineno">11161</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="l11162"></a><span class="lineno">11162</span>&#160;</div><div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div><div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;</div><div class="line"><a name="l11167"></a><span class="lineno">11167</span>&#160;    vma_delete(allocator, m_pMetadata);</div><div class="line"><a name="l11168"></a><span class="lineno">11168</span>&#160;    m_pMetadata = VMA_NULL;</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;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</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">return</span> m_pMetadata-&gt;Validate();</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;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l11182"></a><span class="lineno">11182</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l11183"></a><span class="lineno">11183</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11184"></a><span class="lineno">11184</span>&#160;    {</div><div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160;        <span class="keywordflow">return</span> res;</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;</div><div class="line"><a name="l11188"></a><span class="lineno">11188</span>&#160;    res = m_pMetadata-&gt;CheckCorruption(pData);</div><div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;</div><div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160;    Unmap(hAllocator, 1);</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;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160;}</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;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="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">if</span>(count == 0)</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;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11200"></a><span class="lineno">11200</span>&#160;    }</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;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11203"></a><span class="lineno">11203</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</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;        m_MapCount += count;</div><div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</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;            *ppData = m_pMappedData;</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">return</span> VK_SUCCESS;</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;    <span class="keywordflow">else</span></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;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l11216"></a><span class="lineno">11216</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160;            m_hMemory,</div><div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l11219"></a><span class="lineno">11219</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l11220"></a><span class="lineno">11220</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l11222"></a><span class="lineno">11222</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l11223"></a><span class="lineno">11223</span>&#160;        {</div><div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</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;                *ppData = m_pMappedData;</div><div class="line"><a name="l11227"></a><span class="lineno">11227</span>&#160;            }</div><div class="line"><a name="l11228"></a><span class="lineno">11228</span>&#160;            m_MapCount = count;</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="keywordflow">return</span> result;</div><div class="line"><a name="l11231"></a><span class="lineno">11231</span>&#160;    }</div><div class="line"><a name="l11232"></a><span class="lineno">11232</span>&#160;}</div><div class="line"><a name="l11233"></a><span class="lineno">11233</span>&#160;</div><div class="line"><a name="l11234"></a><span class="lineno">11234</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="l11235"></a><span class="lineno">11235</span>&#160;{</div><div class="line"><a name="l11236"></a><span class="lineno">11236</span>&#160;    <span class="keywordflow">if</span>(count == 0)</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;        <span class="keywordflow">return</span>;</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;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11242"></a><span class="lineno">11242</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</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;        m_MapCount -= count;</div><div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</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;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l11248"></a><span class="lineno">11248</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</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;    }</div><div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;    <span class="keywordflow">else</span></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;        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="l11254"></a><span class="lineno">11254</span>&#160;    }</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 VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</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;    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="l11260"></a><span class="lineno">11260</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</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="keywordtype">void</span>* pData;</div><div class="line"><a name="l11263"></a><span class="lineno">11263</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l11264"></a><span class="lineno">11264</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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="keywordflow">return</span> res;</div><div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;    }</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;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</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;    Unmap(hAllocator, 1);</div><div class="line"><a name="l11273"></a><span class="lineno">11273</span>&#160;</div><div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;}</div><div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;</div><div class="line"><a name="l11277"></a><span class="lineno">11277</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="l11278"></a><span class="lineno">11278</span>&#160;{</div><div class="line"><a name="l11279"></a><span class="lineno">11279</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="l11280"></a><span class="lineno">11280</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11281"></a><span class="lineno">11281</span>&#160;</div><div class="line"><a name="l11282"></a><span class="lineno">11282</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l11283"></a><span class="lineno">11283</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l11284"></a><span class="lineno">11284</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11287"></a><span class="lineno">11287</span>&#160;    }</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;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</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">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</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;</div><div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;    Unmap(hAllocator, 1);</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="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11301"></a><span class="lineno">11301</span>&#160;}</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;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l11311"></a><span class="lineno">11311</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l11312"></a><span class="lineno">11312</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div><div class="line"><a name="l11313"></a><span class="lineno">11313</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div><div class="line"><a name="l11314"></a><span class="lineno">11314</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div><div class="line"><a name="l11315"></a><span class="lineno">11315</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="l11316"></a><span class="lineno">11316</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</div><div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;}</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;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l11323"></a><span class="lineno">11323</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l11324"></a><span class="lineno">11324</span>&#160;    VkImage hImage,</div><div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l11328"></a><span class="lineno">11328</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l11329"></a><span class="lineno">11329</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div><div class="line"><a name="l11330"></a><span class="lineno">11330</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div><div class="line"><a name="l11331"></a><span class="lineno">11331</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div><div class="line"><a name="l11332"></a><span class="lineno">11332</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="l11333"></a><span class="lineno">11333</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11334"></a><span class="lineno">11334</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</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;</div><div class="line"><a name="l11337"></a><span class="lineno">11337</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="l11338"></a><span class="lineno">11338</span>&#160;{</div><div class="line"><a name="l11339"></a><span class="lineno">11339</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l11340"></a><span class="lineno">11340</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l11341"></a><span class="lineno">11341</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;}</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;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l11345"></a><span class="lineno">11345</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="l11346"></a><span class="lineno">11346</span>&#160;{</div><div class="line"><a name="l11347"></a><span class="lineno">11347</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="l11348"></a><span class="lineno">11348</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="l11349"></a><span class="lineno">11349</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="l11350"></a><span class="lineno">11350</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="l11351"></a><span class="lineno">11351</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="l11352"></a><span class="lineno">11352</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="l11353"></a><span class="lineno">11353</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="l11354"></a><span class="lineno">11354</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="l11355"></a><span class="lineno">11355</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="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;<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="l11359"></a><span class="lineno">11359</span>&#160;{</div><div class="line"><a name="l11360"></a><span class="lineno">11360</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="l11361"></a><span class="lineno">11361</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="l11362"></a><span class="lineno">11362</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="l11363"></a><span class="lineno">11363</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="l11364"></a><span class="lineno">11364</span>&#160;}</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;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11368"></a><span class="lineno">11368</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="l11369"></a><span class="lineno">11369</span>&#160;    VkDeviceSize preferredBlockSize) :</div><div class="line"><a name="l11370"></a><span class="lineno">11370</span>&#160;    m_BlockVector(</div><div class="line"><a name="l11371"></a><span class="lineno">11371</span>&#160;        hAllocator,</div><div class="line"><a name="l11372"></a><span class="lineno">11372</span>&#160;        this, <span class="comment">// hParentPool</span></div><div class="line"><a name="l11373"></a><span class="lineno">11373</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div><div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l11377"></a><span class="lineno">11377</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="l11378"></a><span class="lineno">11378</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l11379"></a><span class="lineno">11379</span>&#160;        true, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l11380"></a><span class="lineno">11380</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l11381"></a><span class="lineno">11381</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="l11382"></a><span class="lineno">11382</span>&#160;    m_Id(0)</div><div class="line"><a name="l11383"></a><span class="lineno">11383</span>&#160;{</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;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l11387"></a><span class="lineno">11387</span>&#160;{</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;</div><div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;</div><div class="line"><a name="l11392"></a><span class="lineno">11392</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l11395"></a><span class="lineno">11395</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div><div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l11398"></a><span class="lineno">11398</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l11399"></a><span class="lineno">11399</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l11403"></a><span class="lineno">11403</span>&#160;    <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l11404"></a><span class="lineno">11404</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;    uint32_t algorithm) :</div><div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l11407"></a><span class="lineno">11407</span>&#160;    m_hParentPool(hParentPool),</div><div class="line"><a name="l11408"></a><span class="lineno">11408</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l11410"></a><span class="lineno">11410</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l11411"></a><span class="lineno">11411</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l11412"></a><span class="lineno">11412</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l11413"></a><span class="lineno">11413</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l11415"></a><span class="lineno">11415</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div><div class="line"><a name="l11416"></a><span class="lineno">11416</span>&#160;    m_Algorithm(algorithm),</div><div class="line"><a name="l11417"></a><span class="lineno">11417</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l11418"></a><span class="lineno">11418</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;    m_NextBlockId(0)</div><div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;{</div><div class="line"><a name="l11421"></a><span class="lineno">11421</span>&#160;}</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;VmaBlockVector::~VmaBlockVector()</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">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</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;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l11428"></a><span class="lineno">11428</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</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;</div><div class="line"><a name="l11432"></a><span class="lineno">11432</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l11433"></a><span class="lineno">11433</span>&#160;{</div><div class="line"><a name="l11434"></a><span class="lineno">11434</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="l11435"></a><span class="lineno">11435</span>&#160;    {</div><div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160;        <span class="keywordflow">if</span>(res != 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;            <span class="keywordflow">return</span> res;</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;    }</div><div class="line"><a name="l11442"></a><span class="lineno">11442</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</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;</div><div class="line"><a name="l11445"></a><span class="lineno">11445</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="l11446"></a><span class="lineno">11446</span>&#160;{</div><div class="line"><a name="l11447"></a><span class="lineno">11447</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</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="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</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;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l11452"></a><span class="lineno">11452</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l11453"></a><span class="lineno">11453</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l11454"></a><span class="lineno">11454</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l11456"></a><span class="lineno">11456</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</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;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l11459"></a><span class="lineno">11459</span>&#160;    {</div><div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11462"></a><span class="lineno">11462</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l11463"></a><span class="lineno">11463</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</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;}</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;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l11468"></a><span class="lineno">11468</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l11469"></a><span class="lineno">11469</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="l11470"></a><span class="lineno">11470</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div><div class="line"><a name="l11471"></a><span class="lineno">11471</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div><div class="line"><a name="l11472"></a><span class="lineno">11472</span>&#160;        (m_Algorithm == 0 || m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>) &amp;&amp;</div><div class="line"><a name="l11473"></a><span class="lineno">11473</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</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;</div><div class="line"><a name="l11476"></a><span class="lineno">11476</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="l11477"></a><span class="lineno">11477</span>&#160;</div><div class="line"><a name="l11478"></a><span class="lineno">11478</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l11480"></a><span class="lineno">11480</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l11481"></a><span class="lineno">11481</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l11482"></a><span class="lineno">11482</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="l11483"></a><span class="lineno">11483</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l11485"></a><span class="lineno">11485</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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;    <span class="keywordtype">size_t</span> allocIndex;</div><div class="line"><a name="l11488"></a><span class="lineno">11488</span>&#160;    VkResult res = VK_SUCCESS;</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="keywordflow">if</span>(IsCorruptionDetectionEnabled())</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;        size = VmaAlignUp&lt;VkDeviceSize&gt;(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div><div class="line"><a name="l11493"></a><span class="lineno">11493</span>&#160;        alignment = VmaAlignUp&lt;VkDeviceSize&gt;(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</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;    {</div><div class="line"><a name="l11497"></a><span class="lineno">11497</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11498"></a><span class="lineno">11498</span>&#160;        <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l11499"></a><span class="lineno">11499</span>&#160;        {</div><div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;            res = AllocatePage(</div><div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;                currentFrameIndex,</div><div class="line"><a name="l11502"></a><span class="lineno">11502</span>&#160;                size,</div><div class="line"><a name="l11503"></a><span class="lineno">11503</span>&#160;                alignment,</div><div class="line"><a name="l11504"></a><span class="lineno">11504</span>&#160;                createInfo,</div><div class="line"><a name="l11505"></a><span class="lineno">11505</span>&#160;                suballocType,</div><div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;                pAllocations + allocIndex);</div><div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</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">break</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;        }</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;</div><div class="line"><a name="l11514"></a><span class="lineno">11514</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11515"></a><span class="lineno">11515</span>&#160;    {</div><div class="line"><a name="l11516"></a><span class="lineno">11516</span>&#160;        <span class="comment">// Free all already created allocations.</span></div><div class="line"><a name="l11517"></a><span class="lineno">11517</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div><div class="line"><a name="l11518"></a><span class="lineno">11518</span>&#160;        {</div><div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;            Free(pAllocations[allocIndex]);</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;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</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;</div><div class="line"><a name="l11524"></a><span class="lineno">11524</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11525"></a><span class="lineno">11525</span>&#160;}</div><div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160;</div><div class="line"><a name="l11527"></a><span class="lineno">11527</span>&#160;VkResult VmaBlockVector::AllocatePage(</div><div class="line"><a name="l11528"></a><span class="lineno">11528</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l11529"></a><span class="lineno">11529</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l11530"></a><span class="lineno">11530</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l11531"></a><span class="lineno">11531</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="l11532"></a><span class="lineno">11532</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l11533"></a><span class="lineno">11533</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l11534"></a><span class="lineno">11534</span>&#160;{</div><div class="line"><a name="l11535"></a><span class="lineno">11535</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="l11536"></a><span class="lineno">11536</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="l11537"></a><span class="lineno">11537</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="l11538"></a><span class="lineno">11538</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="l11539"></a><span class="lineno">11539</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l11540"></a><span class="lineno">11540</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="l11541"></a><span class="lineno">11541</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l11542"></a><span class="lineno">11542</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="l11543"></a><span class="lineno">11543</span>&#160;</div><div class="line"><a name="l11544"></a><span class="lineno">11544</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="l11545"></a><span class="lineno">11545</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div><div class="line"><a name="l11546"></a><span class="lineno">11546</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="l11547"></a><span class="lineno">11547</span>&#160;    {</div><div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</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="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div><div class="line"><a name="l11552"></a><span class="lineno">11552</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div><div class="line"><a name="l11553"></a><span class="lineno">11553</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="l11554"></a><span class="lineno">11554</span>&#160;    {</div><div class="line"><a name="l11555"></a><span class="lineno">11555</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l11556"></a><span class="lineno">11556</span>&#160;    }</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;    <span class="comment">// Validate strategy.</span></div><div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160;    <span class="keywordflow">switch</span>(strategy)</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;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l11562"></a><span class="lineno">11562</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="l11563"></a><span class="lineno">11563</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11564"></a><span class="lineno">11564</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="l11565"></a><span class="lineno">11565</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="l11566"></a><span class="lineno">11566</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="l11567"></a><span class="lineno">11567</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l11569"></a><span class="lineno">11569</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</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="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div><div class="line"><a name="l11573"></a><span class="lineno">11573</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</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;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</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;</div><div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div><div class="line"><a name="l11580"></a><span class="lineno">11580</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="l11581"></a><span class="lineno">11581</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div><div class="line"><a name="l11582"></a><span class="lineno">11582</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l11583"></a><span class="lineno">11583</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div><div class="line"><a name="l11584"></a><span class="lineno">11584</span>&#160;    {</div><div class="line"><a name="l11585"></a><span class="lineno">11585</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l11586"></a><span class="lineno">11586</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="l11587"></a><span class="lineno">11587</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="l11588"></a><span class="lineno">11588</span>&#160;</div><div class="line"><a name="l11589"></a><span class="lineno">11589</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="l11590"></a><span class="lineno">11590</span>&#160;        {</div><div class="line"><a name="l11591"></a><span class="lineno">11591</span>&#160;            <span class="comment">// Use only last block.</span></div><div class="line"><a name="l11592"></a><span class="lineno">11592</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</div><div class="line"><a name="l11593"></a><span class="lineno">11593</span>&#160;            {</div><div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div><div class="line"><a name="l11595"></a><span class="lineno">11595</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l11596"></a><span class="lineno">11596</span>&#160;                VkResult res = AllocateFromBlock(</div><div class="line"><a name="l11597"></a><span class="lineno">11597</span>&#160;                    pCurrBlock,</div><div class="line"><a name="l11598"></a><span class="lineno">11598</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l11599"></a><span class="lineno">11599</span>&#160;                    size,</div><div class="line"><a name="l11600"></a><span class="lineno">11600</span>&#160;                    alignment,</div><div class="line"><a name="l11601"></a><span class="lineno">11601</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;                    suballocType,</div><div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;                    strategy,</div><div class="line"><a name="l11605"></a><span class="lineno">11605</span>&#160;                    pAllocation);</div><div class="line"><a name="l11606"></a><span class="lineno">11606</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;                {</div><div class="line"><a name="l11608"></a><span class="lineno">11608</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="l11609"></a><span class="lineno">11609</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11610"></a><span class="lineno">11610</span>&#160;                }</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;        }</div><div class="line"><a name="l11613"></a><span class="lineno">11613</span>&#160;        <span class="keywordflow">else</span></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;            <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="l11616"></a><span class="lineno">11616</span>&#160;            {</div><div class="line"><a name="l11617"></a><span class="lineno">11617</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="l11618"></a><span class="lineno">11618</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="l11619"></a><span class="lineno">11619</span>&#160;                {</div><div class="line"><a name="l11620"></a><span class="lineno">11620</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11621"></a><span class="lineno">11621</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;                        size,</div><div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160;                        alignment,</div><div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;                        allocFlagsCopy,</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#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;                        suballocType,</div><div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160;                        strategy,</div><div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;                        pAllocation);</div><div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</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;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</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;                }</div><div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;            }</div><div class="line"><a name="l11639"></a><span class="lineno">11639</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l11640"></a><span class="lineno">11640</span>&#160;            {</div><div class="line"><a name="l11641"></a><span class="lineno">11641</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="l11642"></a><span class="lineno">11642</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;                {</div><div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160;                        size,</div><div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;                        alignment,</div><div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160;                        allocFlagsCopy,</div><div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;                        suballocType,</div><div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;                        strategy,</div><div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;                        pAllocation);</div><div class="line"><a name="l11656"></a><span class="lineno">11656</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;                    {</div><div class="line"><a name="l11658"></a><span class="lineno">11658</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="l11659"></a><span class="lineno">11659</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160;                    }</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;        }</div><div class="line"><a name="l11664"></a><span class="lineno">11664</span>&#160;</div><div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;        <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;        {</div><div class="line"><a name="l11668"></a><span class="lineno">11668</span>&#160;            <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l11669"></a><span class="lineno">11669</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l11670"></a><span class="lineno">11670</span>&#160;            uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l11671"></a><span class="lineno">11671</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160;</div><div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</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="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l11677"></a><span class="lineno">11677</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="l11678"></a><span class="lineno">11678</span>&#160;                {</div><div class="line"><a name="l11679"></a><span class="lineno">11679</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l11680"></a><span class="lineno">11680</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div><div class="line"><a name="l11681"></a><span class="lineno">11681</span>&#160;                    {</div><div class="line"><a name="l11682"></a><span class="lineno">11682</span>&#160;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l11683"></a><span class="lineno">11683</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;                    }</div><div class="line"><a name="l11685"></a><span class="lineno">11685</span>&#160;                    <span class="keywordflow">else</span></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="keywordflow">break</span>;</div><div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;                    }</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;            }</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;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160;            VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l11694"></a><span class="lineno">11694</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="l11695"></a><span class="lineno">11695</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div><div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;            {</div><div class="line"><a name="l11697"></a><span class="lineno">11697</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="l11698"></a><span class="lineno">11698</span>&#160;                {</div><div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= 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;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l11703"></a><span class="lineno">11703</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l11704"></a><span class="lineno">11704</span>&#160;                        res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;                    }</div><div class="line"><a name="l11706"></a><span class="lineno">11706</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l11707"></a><span class="lineno">11707</span>&#160;                    {</div><div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</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="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160;            {</div><div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</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;                res = AllocateFromBlock(</div><div class="line"><a name="l11719"></a><span class="lineno">11719</span>&#160;                    pBlock,</div><div class="line"><a name="l11720"></a><span class="lineno">11720</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;                    size,</div><div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;                    alignment,</div><div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;                    suballocType,</div><div class="line"><a name="l11726"></a><span class="lineno">11726</span>&#160;                    strategy,</div><div class="line"><a name="l11727"></a><span class="lineno">11727</span>&#160;                    pAllocation);</div><div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l11729"></a><span class="lineno">11729</span>&#160;                {</div><div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block Size=%llu&quot;</span>, newBlockSize);</div><div class="line"><a name="l11731"></a><span class="lineno">11731</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11732"></a><span class="lineno">11732</span>&#160;                }</div><div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div><div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;                }</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;        }</div><div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160;    }</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;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;    {</div><div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</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;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l11750"></a><span class="lineno">11750</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</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;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l11753"></a><span class="lineno">11753</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="l11754"></a><span class="lineno">11754</span>&#160;            {</div><div class="line"><a name="l11755"></a><span class="lineno">11755</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="l11756"></a><span class="lineno">11756</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="l11757"></a><span class="lineno">11757</span>&#160;                {</div><div class="line"><a name="l11758"></a><span class="lineno">11758</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11759"></a><span class="lineno">11759</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l11760"></a><span class="lineno">11760</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l11762"></a><span class="lineno">11762</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l11763"></a><span class="lineno">11763</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;                        size,</div><div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;                        alignment,</div><div class="line"><a name="l11767"></a><span class="lineno">11767</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="l11768"></a><span class="lineno">11768</span>&#160;                        suballocType,</div><div class="line"><a name="l11769"></a><span class="lineno">11769</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l11770"></a><span class="lineno">11770</span>&#160;                        strategy,</div><div class="line"><a name="l11771"></a><span class="lineno">11771</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l11772"></a><span class="lineno">11772</span>&#160;                    {</div><div class="line"><a name="l11773"></a><span class="lineno">11773</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l11774"></a><span class="lineno">11774</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l11775"></a><span class="lineno">11775</span>&#160;                            currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l11776"></a><span class="lineno">11776</span>&#160;                        {</div><div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160;                            bestRequestCost = currRequestCost;</div><div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;</div><div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;                            {</div><div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;                                <span class="keywordflow">break</span>;</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;                    }</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;            }</div><div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></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;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div><div class="line"><a name="l11792"></a><span class="lineno">11792</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</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;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11795"></a><span class="lineno">11795</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l11798"></a><span class="lineno">11798</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l11799"></a><span class="lineno">11799</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l11801"></a><span class="lineno">11801</span>&#160;                        size,</div><div class="line"><a name="l11802"></a><span class="lineno">11802</span>&#160;                        alignment,</div><div class="line"><a name="l11803"></a><span class="lineno">11803</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="l11804"></a><span class="lineno">11804</span>&#160;                        suballocType,</div><div class="line"><a name="l11805"></a><span class="lineno">11805</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;                        strategy,</div><div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;                    {</div><div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l11810"></a><span class="lineno">11810</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l11811"></a><span class="lineno">11811</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div><div class="line"><a name="l11812"></a><span class="lineno">11812</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="l11813"></a><span class="lineno">11813</span>&#160;                        {</div><div class="line"><a name="l11814"></a><span class="lineno">11814</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l11815"></a><span class="lineno">11815</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160;                            bestRequestCost = currRequestCost;</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;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div><div class="line"><a name="l11819"></a><span class="lineno">11819</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="l11820"></a><span class="lineno">11820</span>&#160;                            {</div><div class="line"><a name="l11821"></a><span class="lineno">11821</span>&#160;                                <span class="keywordflow">break</span>;</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;                    }</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;            }</div><div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;</div><div class="line"><a name="l11828"></a><span class="lineno">11828</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</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;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;                {</div><div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11836"></a><span class="lineno">11836</span>&#160;                    }</div><div class="line"><a name="l11837"></a><span class="lineno">11837</span>&#160;                }</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;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div><div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l11841"></a><span class="lineno">11841</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l11842"></a><span class="lineno">11842</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;                {</div><div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;IsEmpty())</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;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;                    }</div><div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160;                    *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate();</div><div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;                    (*pAllocation)-&gt;Ctor(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l11853"></a><span class="lineno">11853</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l11855"></a><span class="lineno">11855</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l11856"></a><span class="lineno">11856</span>&#160;                        alignment,</div><div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;                        size,</div><div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;                        suballocType,</div><div class="line"><a name="l11859"></a><span class="lineno">11859</span>&#160;                        mapped,</div><div class="line"><a name="l11860"></a><span class="lineno">11860</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="l11861"></a><span class="lineno">11861</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block&quot;</span>);</div><div class="line"><a name="l11863"></a><span class="lineno">11863</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="l11864"></a><span class="lineno">11864</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</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;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</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="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;                    {</div><div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div><div class="line"><a name="l11871"></a><span class="lineno">11871</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="l11872"></a><span class="lineno">11872</span>&#160;                    }</div><div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</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;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div><div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;            }</div><div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;            <span class="keywordflow">else</span></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;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160;                <span class="keywordflow">break</span>;</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;        }</div><div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l11884"></a><span class="lineno">11884</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l11885"></a><span class="lineno">11885</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</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;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l11889"></a><span class="lineno">11889</span>&#160;        }</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;</div><div class="line"><a name="l11892"></a><span class="lineno">11892</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</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;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160;    {</div><div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;</div><div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;</div><div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</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;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div><div class="line"><a name="l11909"></a><span class="lineno">11909</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="l11910"></a><span class="lineno">11910</span>&#160;        }</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;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</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;            pBlock-&gt;Unmap(m_hAllocator, 1);</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;</div><div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div><div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</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;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, m_MemoryTypeIndex);</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;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l11923"></a><span class="lineno">11923</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</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="comment">// Already has empty Allocation. We don&#39;t want to have two, so delete this one.</span></div><div class="line"><a name="l11926"></a><span class="lineno">11926</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;            {</div><div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l11929"></a><span class="lineno">11929</span>&#160;                Remove(pBlock);</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="comment">// We now have first empty block.</span></div><div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;            <span class="keywordflow">else</span></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;                m_HasEmptyBlock = <span class="keyword">true</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;        }</div><div class="line"><a name="l11937"></a><span class="lineno">11937</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="l11938"></a><span class="lineno">11938</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l11939"></a><span class="lineno">11939</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</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;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l11942"></a><span class="lineno">11942</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="l11943"></a><span class="lineno">11943</span>&#160;            {</div><div class="line"><a name="l11944"></a><span class="lineno">11944</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l11945"></a><span class="lineno">11945</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l11946"></a><span class="lineno">11946</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</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;        }</div><div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;</div><div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;        IncrementallySortBlocks();</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;</div><div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</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;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l11958"></a><span class="lineno">11958</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l11959"></a><span class="lineno">11959</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l11960"></a><span class="lineno">11960</span>&#160;    }</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;</div><div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l11964"></a><span class="lineno">11964</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l11965"></a><span class="lineno">11965</span>&#160;    VkDeviceSize result = 0;</div><div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); 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;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div><div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</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;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;        }</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">return</span> result;</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;</div><div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</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">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</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;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l11982"></a><span class="lineno">11982</span>&#160;        {</div><div class="line"><a name="l11983"></a><span class="lineno">11983</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l11984"></a><span class="lineno">11984</span>&#160;            <span class="keywordflow">return</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;    VMA_ASSERT(0);</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;</div><div class="line"><a name="l11990"></a><span class="lineno">11990</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l11991"></a><span class="lineno">11991</span>&#160;{</div><div class="line"><a name="l11992"></a><span class="lineno">11992</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="l11993"></a><span class="lineno">11993</span>&#160;    {</div><div class="line"><a name="l11994"></a><span class="lineno">11994</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l11995"></a><span class="lineno">11995</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="l11996"></a><span class="lineno">11996</span>&#160;        {</div><div class="line"><a name="l11997"></a><span class="lineno">11997</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="l11998"></a><span class="lineno">11998</span>&#160;            {</div><div class="line"><a name="l11999"></a><span class="lineno">11999</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;                <span class="keywordflow">return</span>;</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;}</div><div class="line"><a name="l12005"></a><span class="lineno">12005</span>&#160;</div><div class="line"><a name="l12006"></a><span class="lineno">12006</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div><div class="line"><a name="l12007"></a><span class="lineno">12007</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l12009"></a><span class="lineno">12009</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l12010"></a><span class="lineno">12010</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l12011"></a><span class="lineno">12011</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l12012"></a><span class="lineno">12012</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160;{</div><div class="line"><a name="l12017"></a><span class="lineno">12017</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="l12018"></a><span class="lineno">12018</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="l12019"></a><span class="lineno">12019</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="l12020"></a><span class="lineno">12020</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="l12021"></a><span class="lineno">12021</span>&#160;</div><div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160;    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;        currentFrameIndex,</div><div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;        m_FrameInUseCount,</div><div class="line"><a name="l12026"></a><span class="lineno">12026</span>&#160;        m_BufferImageGranularity,</div><div class="line"><a name="l12027"></a><span class="lineno">12027</span>&#160;        size,</div><div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;        alignment,</div><div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;        isUpperAddress,</div><div class="line"><a name="l12030"></a><span class="lineno">12030</span>&#160;        suballocType,</div><div class="line"><a name="l12031"></a><span class="lineno">12031</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l12032"></a><span class="lineno">12032</span>&#160;        strategy,</div><div class="line"><a name="l12033"></a><span class="lineno">12033</span>&#160;        &amp;currRequest))</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;        <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l12036"></a><span class="lineno">12036</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</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="keywordflow">if</span>(mapped)</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;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l12041"></a><span class="lineno">12041</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</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="keywordflow">return</span> res;</div><div class="line"><a name="l12044"></a><span class="lineno">12044</span>&#160;            }</div><div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;        }</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="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</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_HasEmptyBlock = <span class="keyword">false</span>;</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;            </div><div class="line"><a name="l12053"></a><span class="lineno">12053</span>&#160;        *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate();</div><div class="line"><a name="l12054"></a><span class="lineno">12054</span>&#160;        (*pAllocation)-&gt;Ctor(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l12055"></a><span class="lineno">12055</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l12056"></a><span class="lineno">12056</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160;            pBlock,</div><div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;            currRequest.offset,</div><div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160;            alignment,</div><div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;            size,</div><div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;            suballocType,</div><div class="line"><a name="l12062"></a><span class="lineno">12062</span>&#160;            mapped,</div><div class="line"><a name="l12063"></a><span class="lineno">12063</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="l12064"></a><span class="lineno">12064</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div><div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</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_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l12069"></a><span class="lineno">12069</span>&#160;        }</div><div class="line"><a name="l12070"></a><span class="lineno">12070</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</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;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div><div class="line"><a name="l12073"></a><span class="lineno">12073</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="l12074"></a><span class="lineno">12074</span>&#160;        }</div><div class="line"><a name="l12075"></a><span class="lineno">12075</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12076"></a><span class="lineno">12076</span>&#160;    }</div><div class="line"><a name="l12077"></a><span class="lineno">12077</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12078"></a><span class="lineno">12078</span>&#160;}</div><div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;</div><div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</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;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l12083"></a><span class="lineno">12083</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l12084"></a><span class="lineno">12084</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l12085"></a><span class="lineno">12085</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l12086"></a><span class="lineno">12086</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l12087"></a><span class="lineno">12087</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</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="keywordflow">return</span> res;</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;</div><div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;</div><div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160;        m_hAllocator,</div><div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;        m_hParentPool,</div><div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;        mem,</div><div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;        allocInfo.allocationSize,</div><div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;        m_NextBlockId++,</div><div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160;        m_Algorithm);</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_Blocks.push_back(pBlock);</div><div class="line"><a name="l12106"></a><span class="lineno">12106</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</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;        *pNewBlockIndex = m_Blocks.size() - 1;</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;</div><div class="line"><a name="l12111"></a><span class="lineno">12111</span>&#160;    <span class="keywordflow">return</span> 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;</div><div class="line"><a name="l12114"></a><span class="lineno">12114</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesCpu(</div><div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div><div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves)</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div><div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator-&gt;IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</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="keyword">enum</span> BLOCK_FLAG</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;        BLOCK_FLAG_USED = 0x00000001,</div><div class="line"><a name="l12124"></a><span class="lineno">12124</span>&#160;        BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</div><div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;    };</div><div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;</div><div class="line"><a name="l12127"></a><span class="lineno">12127</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l12128"></a><span class="lineno">12128</span>&#160;    {</div><div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160;        uint32_t flags;</div><div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;        <span class="keywordtype">void</span>* pMappedData;</div><div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;    };</div><div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt;</div><div class="line"><a name="l12133"></a><span class="lineno">12133</span>&#160;        blockInfo(blockCount, VmaStlAllocator&lt;BlockInfo&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div><div class="line"><a name="l12134"></a><span class="lineno">12134</span>&#160;    memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</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;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div><div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div><div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</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="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div><div class="line"><a name="l12141"></a><span class="lineno">12141</span>&#160;        blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div><div class="line"><a name="l12142"></a><span class="lineno">12142</span>&#160;        blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</div><div class="line"><a name="l12143"></a><span class="lineno">12143</span>&#160;    }</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;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</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;    <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div><div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;    {</div><div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160;        BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div><div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_USED) != 0)</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;            currBlockInfo.pMappedData = pBlock-&gt;GetMappedData();</div><div class="line"><a name="l12155"></a><span class="lineno">12155</span>&#160;            <span class="comment">// It is not originally mapped - map it.</span></div><div class="line"><a name="l12156"></a><span class="lineno">12156</span>&#160;            <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</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;                pDefragCtx-&gt;res = pBlock-&gt;Map(m_hAllocator, 1, &amp;currBlockInfo.pMappedData);</div><div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div><div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;                {</div><div class="line"><a name="l12161"></a><span class="lineno">12161</span>&#160;                    currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</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;            }</div><div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;        }</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;</div><div class="line"><a name="l12167"></a><span class="lineno">12167</span>&#160;    <span class="comment">// Go over all moves. Do actual data transfer.</span></div><div class="line"><a name="l12168"></a><span class="lineno">12168</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div><div class="line"><a name="l12169"></a><span class="lineno">12169</span>&#160;    {</div><div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator-&gt;m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;</div><div class="line"><a name="l12173"></a><span class="lineno">12173</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div><div class="line"><a name="l12174"></a><span class="lineno">12174</span>&#160;        {</div><div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</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;            <span class="keyword">const</span> BlockInfo&amp; srcBlockInfo = blockInfo[move.srcBlockIndex];</div><div class="line"><a name="l12178"></a><span class="lineno">12178</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; dstBlockInfo = blockInfo[move.dstBlockIndex];</div><div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;</div><div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;            VMA_ASSERT(srcBlockInfo.pMappedData &amp;&amp; dstBlockInfo.pMappedData);</div><div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;</div><div class="line"><a name="l12182"></a><span class="lineno">12182</span>&#160;            <span class="comment">// Invalidate source.</span></div><div class="line"><a name="l12183"></a><span class="lineno">12183</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div><div class="line"><a name="l12184"></a><span class="lineno">12184</span>&#160;            {</div><div class="line"><a name="l12185"></a><span class="lineno">12185</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div><div class="line"><a name="l12186"></a><span class="lineno">12186</span>&#160;                memRange.memory = pSrcBlock-&gt;GetDeviceMemory();</div><div class="line"><a name="l12187"></a><span class="lineno">12187</span>&#160;                memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div><div class="line"><a name="l12188"></a><span class="lineno">12188</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l12189"></a><span class="lineno">12189</span>&#160;                    VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l12190"></a><span class="lineno">12190</span>&#160;                    pSrcBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div><div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</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;</div><div class="line"><a name="l12194"></a><span class="lineno">12194</span>&#160;            <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l12195"></a><span class="lineno">12195</span>&#160;            memmove(</div><div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160;                reinterpret_cast&lt;char*&gt;(dstBlockInfo.pMappedData) + move.dstOffset,</div><div class="line"><a name="l12197"></a><span class="lineno">12197</span>&#160;                reinterpret_cast&lt;char*&gt;(srcBlockInfo.pMappedData) + move.srcOffset,</div><div class="line"><a name="l12198"></a><span class="lineno">12198</span>&#160;                static_cast&lt;size_t&gt;(move.size));</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;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160;            {</div><div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div><div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160;            }</div><div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160;</div><div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;            <span class="comment">// Flush destination.</span></div><div class="line"><a name="l12207"></a><span class="lineno">12207</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div><div class="line"><a name="l12208"></a><span class="lineno">12208</span>&#160;            {</div><div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div><div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;                memRange.memory = pDstBlock-&gt;GetDeviceMemory();</div><div class="line"><a name="l12211"></a><span class="lineno">12211</span>&#160;                memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div><div class="line"><a name="l12212"></a><span class="lineno">12212</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l12213"></a><span class="lineno">12213</span>&#160;                    VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l12214"></a><span class="lineno">12214</span>&#160;                    pDstBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div><div class="line"><a name="l12215"></a><span class="lineno">12215</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</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;        }</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;</div><div class="line"><a name="l12220"></a><span class="lineno">12220</span>&#160;    <span class="comment">// Go over all blocks in reverse order. Unmap those that were mapped just for defragmentation.</span></div><div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;    <span class="comment">// Regardless of pCtx-&gt;res == VK_SUCCESS.</span></div><div class="line"><a name="l12222"></a><span class="lineno">12222</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</div><div class="line"><a name="l12223"></a><span class="lineno">12223</span>&#160;    {</div><div class="line"><a name="l12224"></a><span class="lineno">12224</span>&#160;        <span class="keyword">const</span> BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div><div class="line"><a name="l12225"></a><span class="lineno">12225</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div><div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;        {</div><div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l12229"></a><span class="lineno">12229</span>&#160;        }</div><div class="line"><a name="l12230"></a><span class="lineno">12230</span>&#160;    }</div><div class="line"><a name="l12231"></a><span class="lineno">12231</span>&#160;}</div><div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;</div><div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div><div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div><div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;    VkCommandBuffer commandBuffer)</div><div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;{</div><div class="line"><a name="l12238"></a><span class="lineno">12238</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div><div class="line"><a name="l12239"></a><span class="lineno">12239</span>&#160;</div><div class="line"><a name="l12240"></a><span class="lineno">12240</span>&#160;    pDefragCtx-&gt;blockContexts.resize(blockCount);</div><div class="line"><a name="l12241"></a><span class="lineno">12241</span>&#160;    memset(pDefragCtx-&gt;blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div><div class="line"><a name="l12242"></a><span class="lineno">12242</span>&#160;</div><div class="line"><a name="l12243"></a><span class="lineno">12243</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div><div class="line"><a name="l12244"></a><span class="lineno">12244</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div><div class="line"><a name="l12245"></a><span class="lineno">12245</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div><div class="line"><a name="l12246"></a><span class="lineno">12246</span>&#160;    {</div><div class="line"><a name="l12247"></a><span class="lineno">12247</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div><div class="line"><a name="l12248"></a><span class="lineno">12248</span>&#160;        pDefragCtx-&gt;blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div><div class="line"><a name="l12249"></a><span class="lineno">12249</span>&#160;        pDefragCtx-&gt;blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</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;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div><div class="line"><a name="l12253"></a><span class="lineno">12253</span>&#160;</div><div class="line"><a name="l12254"></a><span class="lineno">12254</span>&#160;    <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div><div class="line"><a name="l12255"></a><span class="lineno">12255</span>&#160;    {</div><div class="line"><a name="l12256"></a><span class="lineno">12256</span>&#160;        VkBufferCreateInfo bufCreateInfo;</div><div class="line"><a name="l12257"></a><span class="lineno">12257</span>&#160;        VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</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;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</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;            VmaBlockDefragmentationContext&amp; currBlockCtx = pDefragCtx-&gt;blockContexts[blockIndex];</div><div class="line"><a name="l12262"></a><span class="lineno">12262</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12263"></a><span class="lineno">12263</span>&#160;            <span class="keywordflow">if</span>((currBlockCtx.flags &amp; VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)</div><div class="line"><a name="l12264"></a><span class="lineno">12264</span>&#160;            {</div><div class="line"><a name="l12265"></a><span class="lineno">12265</span>&#160;                bufCreateInfo.size = pBlock-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160;                pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l12267"></a><span class="lineno">12267</span>&#160;                    m_hAllocator-&gt;m_hDevice, &amp;bufCreateInfo, m_hAllocator-&gt;GetAllocationCallbacks(), &amp;currBlockCtx.hBuffer);</div><div class="line"><a name="l12268"></a><span class="lineno">12268</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</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;                    pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory)(</div><div class="line"><a name="l12271"></a><span class="lineno">12271</span>&#160;                        m_hAllocator-&gt;m_hDevice, currBlockCtx.hBuffer, pBlock-&gt;GetDeviceMemory(), 0);</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;            }</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;    }</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">// Go over all moves. Post data transfer commands to command buffer.</span></div><div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div><div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;    {</div><div class="line"><a name="l12280"></a><span class="lineno">12280</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</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;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</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;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; srcBlockCtx = pDefragCtx-&gt;blockContexts[move.srcBlockIndex];</div><div class="line"><a name="l12285"></a><span class="lineno">12285</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; dstBlockCtx = pDefragCtx-&gt;blockContexts[move.dstBlockIndex];</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;            VMA_ASSERT(srcBlockCtx.hBuffer &amp;&amp; dstBlockCtx.hBuffer);</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;            VkBufferCopy region = {</div><div class="line"><a name="l12290"></a><span class="lineno">12290</span>&#160;                move.srcOffset,</div><div class="line"><a name="l12291"></a><span class="lineno">12291</span>&#160;                move.dstOffset,</div><div class="line"><a name="l12292"></a><span class="lineno">12292</span>&#160;                move.size };</div><div class="line"><a name="l12293"></a><span class="lineno">12293</span>&#160;            (*m_hAllocator-&gt;GetVulkanFunctions().vkCmdCopyBuffer)(</div><div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160;                commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &amp;region);</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;    }</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="comment">// Save buffers to defrag context for later destruction.</span></div><div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; moveCount &gt; 0)</div><div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;    {</div><div class="line"><a name="l12301"></a><span class="lineno">12301</span>&#160;        pDefragCtx-&gt;res = VK_NOT_READY;</div><div class="line"><a name="l12302"></a><span class="lineno">12302</span>&#160;    }</div><div class="line"><a name="l12303"></a><span class="lineno">12303</span>&#160;}</div><div class="line"><a name="l12304"></a><span class="lineno">12304</span>&#160;</div><div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160;{</div><div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</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;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;        {</div><div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160;            {</div><div class="line"><a name="l12315"></a><span class="lineno">12315</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</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;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l12318"></a><span class="lineno">12318</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="l12319"></a><span class="lineno">12319</span>&#160;                }</div><div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160;</div><div class="line"><a name="l12321"></a><span class="lineno">12321</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l12322"></a><span class="lineno">12322</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l12323"></a><span class="lineno">12323</span>&#160;                vma_delete(m_hAllocator, pBlock);</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="keywordflow">else</span></div><div class="line"><a name="l12326"></a><span class="lineno">12326</span>&#160;            {</div><div class="line"><a name="l12327"></a><span class="lineno">12327</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</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;        }</div><div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;    }</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;</div><div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;</div><div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l12336"></a><span class="lineno">12336</span>&#160;{</div><div class="line"><a name="l12337"></a><span class="lineno">12337</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l12338"></a><span class="lineno">12338</span>&#160;</div><div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160;    json.BeginObject();</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;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;    {</div><div class="line"><a name="l12343"></a><span class="lineno">12343</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l12344"></a><span class="lineno">12344</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</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;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l12347"></a><span class="lineno">12347</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l12348"></a><span class="lineno">12348</span>&#160;</div><div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160;        {</div><div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</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;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</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;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160;        }</div><div class="line"><a name="l12361"></a><span class="lineno">12361</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l12362"></a><span class="lineno">12362</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;        json.EndObject();</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">if</span>(m_FrameInUseCount &gt; 0)</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;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l12368"></a><span class="lineno">12368</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;        }</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;        <span class="keywordflow">if</span>(m_Algorithm != 0)</div><div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;        {</div><div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div><div class="line"><a name="l12374"></a><span class="lineno">12374</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div><div class="line"><a name="l12375"></a><span class="lineno">12375</span>&#160;        }</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;    <span class="keywordflow">else</span></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;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l12380"></a><span class="lineno">12380</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</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;</div><div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160;    json.BeginObject();</div><div class="line"><a name="l12385"></a><span class="lineno">12385</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="l12386"></a><span class="lineno">12386</span>&#160;    {</div><div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;        json.BeginString();</div><div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div><div class="line"><a name="l12389"></a><span class="lineno">12389</span>&#160;        json.EndString();</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;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</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;    json.EndObject();</div><div class="line"><a name="l12394"></a><span class="lineno">12394</span>&#160;</div><div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;    json.EndObject();</div><div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;}</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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> VmaBlockVector::Defragment(</div><div class="line"><a name="l12401"></a><span class="lineno">12401</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div><div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160;    VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div><div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;    VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div><div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;    VkCommandBuffer commandBuffer)</div><div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160;{</div><div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;    pCtx-&gt;res = VK_SUCCESS;</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;    <span class="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div><div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;        m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div><div class="line"><a name="l12411"></a><span class="lineno">12411</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</div><div class="line"><a name="l12412"></a><span class="lineno">12412</span>&#160;</div><div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove &gt; 0 &amp;&amp; maxCpuAllocationsToMove &gt; 0 &amp;&amp;</div><div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;        isHostVisible;</div><div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove &gt; 0 &amp;&amp; maxGpuAllocationsToMove &gt; 0 &amp;&amp;</div><div class="line"><a name="l12416"></a><span class="lineno">12416</span>&#160;        !IsCorruptionDetectionEnabled() &amp;&amp;</div><div class="line"><a name="l12417"></a><span class="lineno">12417</span>&#160;        ((1u &lt;&lt; m_MemoryTypeIndex) &amp; m_hAllocator-&gt;GetGpuDefragmentationMemoryTypeBits()) != 0;</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;    <span class="comment">// There are options to defragment this memory type.</span></div><div class="line"><a name="l12420"></a><span class="lineno">12420</span>&#160;    <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</div><div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;    {</div><div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;        <span class="keywordtype">bool</span> defragmentOnGpu;</div><div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;        <span class="comment">// There is only one option to defragment this memory type.</span></div><div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160;        <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</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;            defragmentOnGpu = canDefragmentOnGpu;</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">// Both options are available: Heuristics to choose the best one.</span></div><div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;        <span class="keywordflow">else</span></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;            defragmentOnGpu = (memPropFlags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div><div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;                m_hAllocator-&gt;IsIntegratedGpu();</div><div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160;        }</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;        <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div><div class="line"><a name="l12436"></a><span class="lineno">12436</span>&#160;</div><div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;        <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div><div class="line"><a name="l12438"></a><span class="lineno">12438</span>&#160;        {</div><div class="line"><a name="l12439"></a><span class="lineno">12439</span>&#160;            m_Mutex.LockWrite();</div><div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;            pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;        pCtx-&gt;Begin(overlappingMoveSupported);</div><div class="line"><a name="l12444"></a><span class="lineno">12444</span>&#160;</div><div class="line"><a name="l12445"></a><span class="lineno">12445</span>&#160;        <span class="comment">// Defragment.</span></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;        <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div><div class="line"><a name="l12448"></a><span class="lineno">12448</span>&#160;        <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div><div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt; moves = </div><div class="line"><a name="l12450"></a><span class="lineno">12450</span>&#160;            VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;(VmaStlAllocator&lt;VmaDefragmentationMove&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div><div class="line"><a name="l12451"></a><span class="lineno">12451</span>&#160;        pCtx-&gt;res = pCtx-&gt;GetAlgorithm()-&gt;Defragment(moves, maxBytesToMove, maxAllocationsToMove);</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;        <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l12454"></a><span class="lineno">12454</span>&#160;        <span class="keywordflow">if</span>(pStats != VMA_NULL)</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="keyword">const</span> VkDeviceSize bytesMoved = pCtx-&gt;GetAlgorithm()-&gt;GetBytesMoved();</div><div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;            <span class="keyword">const</span> uint32_t allocationsMoved = pCtx-&gt;GetAlgorithm()-&gt;GetAllocationsMoved();</div><div class="line"><a name="l12458"></a><span class="lineno">12458</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div><div class="line"><a name="l12459"></a><span class="lineno">12459</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div><div class="line"><a name="l12460"></a><span class="lineno">12460</span>&#160;            VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l12461"></a><span class="lineno">12461</span>&#160;            VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l12462"></a><span class="lineno">12462</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</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;                maxGpuBytesToMove -= bytesMoved;</div><div class="line"><a name="l12465"></a><span class="lineno">12465</span>&#160;                maxGpuAllocationsToMove -= allocationsMoved;</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;            <span class="keywordflow">else</span></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;                maxCpuBytesToMove -= bytesMoved;</div><div class="line"><a name="l12470"></a><span class="lineno">12470</span>&#160;                maxCpuAllocationsToMove -= allocationsMoved;</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;    </div><div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160;        <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</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>(defragmentOnGpu)</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;                ApplyDefragmentationMovesGpu(pCtx, moves, commandBuffer);</div><div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;            }</div><div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160;            <span class="keywordflow">else</span></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;                ApplyDefragmentationMovesCpu(pCtx, moves);</div><div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;            }</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;    }</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;</div><div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div><div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div><div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</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">// Destroy buffers.</span></div><div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx-&gt;blockContexts.size(); blockIndex--; )</div><div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;    {</div><div class="line"><a name="l12495"></a><span class="lineno">12495</span>&#160;        VmaBlockDefragmentationContext&amp; blockCtx = pCtx-&gt;blockContexts[blockIndex];</div><div class="line"><a name="l12496"></a><span class="lineno">12496</span>&#160;        <span class="keywordflow">if</span>(blockCtx.hBuffer)</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;            (*m_hAllocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(</div><div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;                m_hAllocator-&gt;m_hDevice, blockCtx.hBuffer, m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;        }</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;</div><div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</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;        FreeEmptyBlocks(pStats);</div><div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;    }</div><div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160;</div><div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked)</div><div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160;    {</div><div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;        VMA_ASSERT(m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l12511"></a><span class="lineno">12511</span>&#160;        m_Mutex.UnlockWrite();</div><div class="line"><a name="l12512"></a><span class="lineno">12512</span>&#160;    }</div><div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;}</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="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div><div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div><div class="line"><a name="l12518"></a><span class="lineno">12518</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="l12519"></a><span class="lineno">12519</span>&#160;    {</div><div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;        result += m_Blocks[i]-&gt;m_pMetadata-&gt;GetAllocationCount();</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="keywordflow">return</span> result;</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;</div><div class="line"><a name="l12525"></a><span class="lineno">12525</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div><div class="line"><a name="l12526"></a><span class="lineno">12526</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12527"></a><span class="lineno">12527</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</div><div class="line"><a name="l12528"></a><span class="lineno">12528</span>&#160;    {</div><div class="line"><a name="l12529"></a><span class="lineno">12529</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l12530"></a><span class="lineno">12530</span>&#160;    }</div><div class="line"><a name="l12531"></a><span class="lineno">12531</span>&#160;    VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i &lt; count; ++i)</div><div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;    {</div><div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div><div class="line"><a name="l12535"></a><span class="lineno">12535</span>&#160;        VMA_ASSERT(m_Algorithm == 0);</div><div class="line"><a name="l12536"></a><span class="lineno">12536</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock-&gt;m_pMetadata;</div><div class="line"><a name="l12537"></a><span class="lineno">12537</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</div><div class="line"><a name="l12538"></a><span class="lineno">12538</span>&#160;        {</div><div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l12540"></a><span class="lineno">12540</span>&#160;        }</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l12543"></a><span class="lineno">12543</span>&#160;}</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="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l12546"></a><span class="lineno">12546</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l12547"></a><span class="lineno">12547</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</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;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l12550"></a><span class="lineno">12550</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l12551"></a><span class="lineno">12551</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</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;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12554"></a><span class="lineno">12554</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l12555"></a><span class="lineno">12555</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</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;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l12558"></a><span class="lineno">12558</span>&#160;    {</div><div class="line"><a name="l12559"></a><span class="lineno">12559</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;    }</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;VkResult VmaBlockVector::CheckCorruption()</div><div class="line"><a name="l12564"></a><span class="lineno">12564</span>&#160;{</div><div class="line"><a name="l12565"></a><span class="lineno">12565</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</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">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</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;</div><div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l12572"></a><span class="lineno">12572</span>&#160;    {</div><div class="line"><a name="l12573"></a><span class="lineno">12573</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12574"></a><span class="lineno">12574</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l12575"></a><span class="lineno">12575</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div><div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;        {</div><div class="line"><a name="l12578"></a><span class="lineno">12578</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12579"></a><span class="lineno">12579</span>&#160;        }</div><div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;    }</div><div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</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;</div><div class="line"><a name="l12584"></a><span class="lineno">12584</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="l12585"></a><span class="lineno">12585</span>&#160;{</div><div class="line"><a name="l12586"></a><span class="lineno">12586</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l12587"></a><span class="lineno">12587</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l12588"></a><span class="lineno">12588</span>&#160;</div><div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;</div><div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160;    {</div><div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l12596"></a><span class="lineno">12596</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l12597"></a><span class="lineno">12597</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l12599"></a><span class="lineno">12599</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l12600"></a><span class="lineno">12600</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;    }</div><div class="line"><a name="l12602"></a><span class="lineno">12602</span>&#160;}</div><div class="line"><a name="l12603"></a><span class="lineno">12603</span>&#160;</div><div class="line"><a name="l12605"></a><span class="lineno">12605</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></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;VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div><div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l12609"></a><span class="lineno">12609</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l12610"></a><span class="lineno">12610</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l12611"></a><span class="lineno">12611</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div><div class="line"><a name="l12612"></a><span class="lineno">12612</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div><div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160;    m_AllocationCount(0),</div><div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;    m_AllAllocations(false),</div><div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160;{</div><div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l12620"></a><span class="lineno">12620</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="l12621"></a><span class="lineno">12621</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="l12622"></a><span class="lineno">12622</span>&#160;    {</div><div class="line"><a name="l12623"></a><span class="lineno">12623</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l12624"></a><span class="lineno">12624</span>&#160;        pBlockInfo-&gt;m_OriginalBlockIndex = blockIndex;</div><div class="line"><a name="l12625"></a><span class="lineno">12625</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l12626"></a><span class="lineno">12626</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l12627"></a><span class="lineno">12627</span>&#160;    }</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">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l12630"></a><span class="lineno">12630</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</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;VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l12636"></a><span class="lineno">12636</span>&#160;    {</div><div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</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> VmaDefragmentationAlgorithm_Generic::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</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;    <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="l12644"></a><span class="lineno">12644</span>&#160;    <span class="keywordflow">if</span>(hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</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;        VmaDeviceMemoryBlock* pBlock = hAlloc-&gt;GetBlock();</div><div class="line"><a name="l12647"></a><span class="lineno">12647</span>&#160;        BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l12648"></a><span class="lineno">12648</span>&#160;        <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l12649"></a><span class="lineno">12649</span>&#160;        {</div><div class="line"><a name="l12650"></a><span class="lineno">12650</span>&#160;            AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div><div class="line"><a name="l12651"></a><span class="lineno">12651</span>&#160;            (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l12652"></a><span class="lineno">12652</span>&#160;        }</div><div class="line"><a name="l12653"></a><span class="lineno">12653</span>&#160;        <span class="keywordflow">else</span></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;            VMA_ASSERT(0);</div><div class="line"><a name="l12656"></a><span class="lineno">12656</span>&#160;        }</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;        ++m_AllocationCount;</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;}</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;VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div><div class="line"><a name="l12663"></a><span class="lineno">12663</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;    uint32_t maxAllocationsToMove)</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>(m_Blocks.empty())</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">return</span> VK_SUCCESS;</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="comment">// This is a choice based on research.</span></div><div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;    <span class="comment">// Option 1:</span></div><div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;    uint32_t strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a>;</div><div class="line"><a name="l12675"></a><span class="lineno">12675</span>&#160;    <span class="comment">// Option 2:</span></div><div class="line"><a name="l12676"></a><span class="lineno">12676</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div><div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;    <span class="comment">// Option 3:</span></div><div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div><div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;</div><div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;    <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div><div class="line"><a name="l12681"></a><span class="lineno">12681</span>&#160;    <span class="comment">// When FAST_ALGORITHM, move allocations from only last out of blocks that contain non-movable allocations.</span></div><div class="line"><a name="l12682"></a><span class="lineno">12682</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160;<span class="comment">    if(m_AlgorithmFlags &amp; VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div><div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;<span class="comment">    {</span></div><div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160;<span class="comment">        const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div><div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;<span class="comment">        if(blocksWithNonMovableCount &gt; 0)</span></div><div class="line"><a name="l12687"></a><span class="lineno">12687</span>&#160;<span class="comment">        {</span></div><div class="line"><a name="l12688"></a><span class="lineno">12688</span>&#160;<span class="comment">            srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div><div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160;<span class="comment">        }</span></div><div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160;<span class="comment">    }</span></div><div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;</div><div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l12694"></a><span class="lineno">12694</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l12695"></a><span class="lineno">12695</span>&#160;    <span class="keywordflow">for</span>(;;)</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="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l12698"></a><span class="lineno">12698</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="l12699"></a><span class="lineno">12699</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div><div class="line"><a name="l12700"></a><span class="lineno">12700</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</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;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</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">// Finished: no more allocations to process.</span></div><div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</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;                    <span class="keywordflow">return</span> VK_SUCCESS;</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l12710"></a><span class="lineno">12710</span>&#160;                {</div><div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;                    srcAllocIndex = SIZE_MAX;</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l12716"></a><span class="lineno">12716</span>&#160;            {</div><div class="line"><a name="l12717"></a><span class="lineno">12717</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</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;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l12722"></a><span class="lineno">12722</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l12723"></a><span class="lineno">12723</span>&#160;</div><div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l12727"></a><span class="lineno">12727</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l12728"></a><span class="lineno">12728</span>&#160;</div><div class="line"><a name="l12729"></a><span class="lineno">12729</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="l12730"></a><span class="lineno">12730</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="l12731"></a><span class="lineno">12731</span>&#160;        {</div><div class="line"><a name="l12732"></a><span class="lineno">12732</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l12734"></a><span class="lineno">12734</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l12735"></a><span class="lineno">12735</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l12736"></a><span class="lineno">12736</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l12737"></a><span class="lineno">12737</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l12738"></a><span class="lineno">12738</span>&#160;                size,</div><div class="line"><a name="l12739"></a><span class="lineno">12739</span>&#160;                alignment,</div><div class="line"><a name="l12740"></a><span class="lineno">12740</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div><div class="line"><a name="l12741"></a><span class="lineno">12741</span>&#160;                suballocType,</div><div class="line"><a name="l12742"></a><span class="lineno">12742</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;                strategy,</div><div class="line"><a name="l12744"></a><span class="lineno">12744</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l12745"></a><span class="lineno">12745</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l12746"></a><span class="lineno">12746</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;            {</div><div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l12749"></a><span class="lineno">12749</span>&#160;</div><div class="line"><a name="l12750"></a><span class="lineno">12750</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l12751"></a><span class="lineno">12751</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l12752"></a><span class="lineno">12752</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</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="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160;                }</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;                VmaDefragmentationMove move;</div><div class="line"><a name="l12758"></a><span class="lineno">12758</span>&#160;                move.srcBlockIndex = pSrcBlockInfo-&gt;m_OriginalBlockIndex;</div><div class="line"><a name="l12759"></a><span class="lineno">12759</span>&#160;                move.dstBlockIndex = pDstBlockInfo-&gt;m_OriginalBlockIndex;</div><div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;                move.srcOffset = srcOffset;</div><div class="line"><a name="l12761"></a><span class="lineno">12761</span>&#160;                move.dstOffset = dstAllocRequest.offset;</div><div class="line"><a name="l12762"></a><span class="lineno">12762</span>&#160;                move.size = size;</div><div class="line"><a name="l12763"></a><span class="lineno">12763</span>&#160;                moves.push_back(move);</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;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div><div class="line"><a name="l12766"></a><span class="lineno">12766</span>&#160;                    dstAllocRequest,</div><div class="line"><a name="l12767"></a><span class="lineno">12767</span>&#160;                    suballocType,</div><div class="line"><a name="l12768"></a><span class="lineno">12768</span>&#160;                    size,</div><div class="line"><a name="l12769"></a><span class="lineno">12769</span>&#160;                    allocInfo.m_hAllocation);</div><div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</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;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l12773"></a><span class="lineno">12773</span>&#160;</div><div class="line"><a name="l12774"></a><span class="lineno">12774</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</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;                    *allocInfo.m_pChanged = VK_TRUE;</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;                ++m_AllocationsMoved;</div><div class="line"><a name="l12780"></a><span class="lineno">12780</span>&#160;                m_BytesMoved += size;</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;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</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;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12785"></a><span class="lineno">12785</span>&#160;            }</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;</div><div class="line"><a name="l12788"></a><span class="lineno">12788</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="l12789"></a><span class="lineno">12789</span>&#160;</div><div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160;        {</div><div class="line"><a name="l12792"></a><span class="lineno">12792</span>&#160;            --srcAllocIndex;</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l12795"></a><span class="lineno">12795</span>&#160;        {</div><div class="line"><a name="l12796"></a><span class="lineno">12796</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l12797"></a><span class="lineno">12797</span>&#160;            {</div><div class="line"><a name="l12798"></a><span class="lineno">12798</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l12799"></a><span class="lineno">12799</span>&#160;                srcAllocIndex = SIZE_MAX;</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></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;                <span class="keywordflow">return</span> VK_SUCCESS;</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;        }</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;}</div><div class="line"><a name="l12808"></a><span class="lineno">12808</span>&#160;</div><div class="line"><a name="l12809"></a><span class="lineno">12809</span>&#160;<span class="keywordtype">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div><div class="line"><a name="l12810"></a><span class="lineno">12810</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12811"></a><span class="lineno">12811</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div><div class="line"><a name="l12812"></a><span class="lineno">12812</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="l12813"></a><span class="lineno">12813</span>&#160;    {</div><div class="line"><a name="l12814"></a><span class="lineno">12814</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i]-&gt;m_HasNonMovableAllocations)</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;            ++result;</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;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;}</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;VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div><div class="line"><a name="l12823"></a><span class="lineno">12823</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;    uint32_t maxAllocationsToMove)</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;    <span class="keywordflow">if</span>(!m_AllAllocations &amp;&amp; m_AllocationCount == 0)</div><div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;    {</div><div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div><div class="line"><a name="l12833"></a><span class="lineno">12833</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="l12834"></a><span class="lineno">12834</span>&#160;    {</div><div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;</div><div class="line"><a name="l12837"></a><span class="lineno">12837</span>&#160;        <span class="keywordflow">if</span>(m_AllAllocations)</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;            VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo-&gt;m_pBlock-&gt;m_pMetadata;</div><div class="line"><a name="l12840"></a><span class="lineno">12840</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata-&gt;m_Suballocations.begin();</div><div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div><div class="line"><a name="l12842"></a><span class="lineno">12842</span>&#160;                ++it)</div><div class="line"><a name="l12843"></a><span class="lineno">12843</span>&#160;            {</div><div class="line"><a name="l12844"></a><span class="lineno">12844</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</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;                    AllocationInfo allocInfo = AllocationInfo(it-&gt;hAllocation, VMA_NULL);</div><div class="line"><a name="l12847"></a><span class="lineno">12847</span>&#160;                    pBlockInfo-&gt;m_Allocations.push_back(allocInfo);</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;</div><div class="line"><a name="l12852"></a><span class="lineno">12852</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</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;        <span class="comment">// This is a choice based on research.</span></div><div class="line"><a name="l12855"></a><span class="lineno">12855</span>&#160;        <span class="comment">// Option 1:</span></div><div class="line"><a name="l12856"></a><span class="lineno">12856</span>&#160;        pBlockInfo-&gt;SortAllocationsByOffsetDescending();</div><div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160;        <span class="comment">// Option 2:</span></div><div class="line"><a name="l12858"></a><span class="lineno">12858</span>&#160;        <span class="comment">//pBlockInfo-&gt;SortAllocationsBySizeDescending();</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;</div><div class="line"><a name="l12861"></a><span class="lineno">12861</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="l12862"></a><span class="lineno">12862</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</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="comment">// This is a choice based on research.</span></div><div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160;    <span class="keyword">const</span> uint32_t roundCount = 2;</div><div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;</div><div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;    <span class="keywordflow">for</span>(uint32_t round = 0; (round &lt; roundCount) &amp;&amp; (result == VK_SUCCESS); ++round)</div><div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;    {</div><div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;        result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;    }</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;    <span class="keywordflow">return</span> result;</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="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div><div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</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>(dstBlockIndex &lt; srcBlockIndex)</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;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</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> <span class="keyword">false</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">if</span>(dstOffset &lt; srcOffset)</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">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="l12897"></a><span class="lineno">12897</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Fast</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;VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div><div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l12903"></a><span class="lineno">12903</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div><div class="line"><a name="l12904"></a><span class="lineno">12904</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div><div class="line"><a name="l12905"></a><span class="lineno">12905</span>&#160;    m_OverlappingMoveSupported(overlappingMoveSupported),</div><div class="line"><a name="l12906"></a><span class="lineno">12906</span>&#160;    m_AllocationCount(0),</div><div class="line"><a name="l12907"></a><span class="lineno">12907</span>&#160;    m_AllAllocations(false),</div><div class="line"><a name="l12908"></a><span class="lineno">12908</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l12909"></a><span class="lineno">12909</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l12910"></a><span class="lineno">12910</span>&#160;    m_BlockInfos(VmaStlAllocator&lt;BlockInfo&gt;(hAllocator-&gt;GetAllocationCallbacks()))</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;    VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</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;}</div><div class="line"><a name="l12915"></a><span class="lineno">12915</span>&#160;</div><div class="line"><a name="l12916"></a><span class="lineno">12916</span>&#160;VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</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;}</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;VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div><div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div><div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160;    uint32_t maxAllocationsToMove)</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_ASSERT(m_AllAllocations || m_pBlockVector-&gt;CalcAllocationCount() == m_AllocationCount);</div><div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;</div><div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div><div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;    <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</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="keywordflow">return</span> VK_SUCCESS;</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;</div><div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160;    PreprocessMetadata();</div><div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;</div><div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160;    <span class="comment">// Sort blocks in order from most destination.</span></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;    m_BlockInfos.resize(blockCount);</div><div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; blockCount; ++i)</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;        m_BlockInfos[i].origBlockIndex = i;</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;</div><div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160;    VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo&amp; lhs, <span class="keyword">const</span> BlockInfo&amp; rhs) -&gt; <span class="keywordtype">bool</span> {</div><div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;        <span class="keywordflow">return</span> m_pBlockVector-&gt;GetBlock(lhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt;</div><div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;            m_pBlockVector-&gt;GetBlock(rhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize();</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;</div><div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160;    <span class="comment">// THE MAIN ALGORITHM</span></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;    FreeSpaceDatabase freeSpaceDb;</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">size_t</span> dstBlockInfoIndex = 0;</div><div class="line"><a name="l12953"></a><span class="lineno">12953</span>&#160;    <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div><div class="line"><a name="l12954"></a><span class="lineno">12954</span>&#160;    VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div><div class="line"><a name="l12955"></a><span class="lineno">12955</span>&#160;    VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div><div class="line"><a name="l12956"></a><span class="lineno">12956</span>&#160;    VkDeviceSize dstBlockSize = pDstMetadata-&gt;GetSize();</div><div class="line"><a name="l12957"></a><span class="lineno">12957</span>&#160;    VkDeviceSize dstOffset = 0;</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;    <span class="keywordtype">bool</span> end = <span class="keyword">false</span>;</div><div class="line"><a name="l12960"></a><span class="lineno">12960</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end &amp;&amp; srcBlockInfoIndex &lt; blockCount; ++srcBlockInfoIndex)</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="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div><div class="line"><a name="l12963"></a><span class="lineno">12963</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector-&gt;GetBlock(srcOrigBlockIndex);</div><div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock-&gt;m_pMetadata;</div><div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata-&gt;m_Suballocations.begin();</div><div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;            !end &amp;&amp; srcSuballocIt != pSrcMetadata-&gt;m_Suballocations.end(); )</div><div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;        {</div><div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160;            VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt-&gt;hAllocation;</div><div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc-&gt;GetAlignment();</div><div class="line"><a name="l12970"></a><span class="lineno">12970</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt-&gt;size;</div><div class="line"><a name="l12971"></a><span class="lineno">12971</span>&#160;            <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div><div class="line"><a name="l12972"></a><span class="lineno">12972</span>&#160;                m_BytesMoved + srcAllocSize &gt; maxBytesToMove)</div><div class="line"><a name="l12973"></a><span class="lineno">12973</span>&#160;            {</div><div class="line"><a name="l12974"></a><span class="lineno">12974</span>&#160;                end = <span class="keyword">true</span>;</div><div class="line"><a name="l12975"></a><span class="lineno">12975</span>&#160;                <span class="keywordflow">break</span>;</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="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt-&gt;offset;</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="comment">// Try to place it in one of free spaces from the database.</span></div><div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;            <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div><div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160;            VkDeviceSize dstAllocOffset;</div><div class="line"><a name="l12982"></a><span class="lineno">12982</span>&#160;            <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div><div class="line"><a name="l12983"></a><span class="lineno">12983</span>&#160;                freeSpaceInfoIndex, dstAllocOffset))</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;                <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div><div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;                VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector-&gt;GetBlock(freeSpaceOrigBlockIndex);</div><div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;                VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock-&gt;m_pMetadata;</div><div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;</div><div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;                <span class="comment">// Same block</span></div><div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;                <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div><div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160;                {</div><div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div><div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;</div><div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div><div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;</div><div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div><div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;                    suballoc.offset = dstAllocOffset;</div><div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;                    suballoc.hAllocation-&gt;ChangeOffset(dstAllocOffset);</div><div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;                    m_BytesMoved += srcAllocSize;</div><div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;                    ++m_AllocationsMoved;</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;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div><div class="line"><a name="l13003"></a><span class="lineno">13003</span>&#160;                    ++nextSuballocIt;</div><div class="line"><a name="l13004"></a><span class="lineno">13004</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div><div class="line"><a name="l13005"></a><span class="lineno">13005</span>&#160;                    srcSuballocIt = nextSuballocIt;</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;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div><div class="line"><a name="l13008"></a><span class="lineno">13008</span>&#160;</div><div class="line"><a name="l13009"></a><span class="lineno">13009</span>&#160;                    VmaDefragmentationMove move = {</div><div class="line"><a name="l13010"></a><span class="lineno">13010</span>&#160;                        srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div><div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;                        srcAllocOffset, dstAllocOffset,</div><div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160;                        srcAllocSize };</div><div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;                    moves.push_back(move);</div><div class="line"><a name="l13014"></a><span class="lineno">13014</span>&#160;                }</div><div class="line"><a name="l13015"></a><span class="lineno">13015</span>&#160;                <span class="comment">// Different block</span></div><div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></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;                    VMA_ASSERT(freeSpaceInfoIndex &lt; srcBlockInfoIndex);</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;                    VmaSuballocation suballoc = *srcSuballocIt;</div><div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;                    suballoc.offset = dstAllocOffset;</div><div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div><div class="line"><a name="l13025"></a><span class="lineno">13025</span>&#160;                    m_BytesMoved += srcAllocSize;</div><div class="line"><a name="l13026"></a><span class="lineno">13026</span>&#160;                    ++m_AllocationsMoved;</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;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div><div class="line"><a name="l13029"></a><span class="lineno">13029</span>&#160;                    ++nextSuballocIt;</div><div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div><div class="line"><a name="l13031"></a><span class="lineno">13031</span>&#160;                    srcSuballocIt = nextSuballocIt;</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;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div><div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160;</div><div class="line"><a name="l13035"></a><span class="lineno">13035</span>&#160;                    VmaDefragmentationMove move = {</div><div class="line"><a name="l13036"></a><span class="lineno">13036</span>&#160;                        srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div><div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160;                        srcAllocOffset, dstAllocOffset,</div><div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;                        srcAllocSize };</div><div class="line"><a name="l13039"></a><span class="lineno">13039</span>&#160;                    moves.push_back(move);</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;            }</div><div class="line"><a name="l13042"></a><span class="lineno">13042</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l13043"></a><span class="lineno">13043</span>&#160;            {</div><div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160;                dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</div><div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;</div><div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;                <span class="comment">// If the allocation doesn&#39;t fit before the end of dstBlock, forward to next block.</span></div><div class="line"><a name="l13047"></a><span class="lineno">13047</span>&#160;                <span class="keywordflow">while</span>(dstBlockInfoIndex &lt; srcBlockInfoIndex &amp;&amp;</div><div class="line"><a name="l13048"></a><span class="lineno">13048</span>&#160;                    dstAllocOffset + srcAllocSize &gt; dstBlockSize)</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;                    <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div><div class="line"><a name="l13051"></a><span class="lineno">13051</span>&#160;                    freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</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;                    ++dstBlockInfoIndex;</div><div class="line"><a name="l13054"></a><span class="lineno">13054</span>&#160;                    dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div><div class="line"><a name="l13055"></a><span class="lineno">13055</span>&#160;                    pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div><div class="line"><a name="l13056"></a><span class="lineno">13056</span>&#160;                    pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div><div class="line"><a name="l13057"></a><span class="lineno">13057</span>&#160;                    dstBlockSize = pDstMetadata-&gt;GetSize();</div><div class="line"><a name="l13058"></a><span class="lineno">13058</span>&#160;                    dstOffset = 0;</div><div class="line"><a name="l13059"></a><span class="lineno">13059</span>&#160;                    dstAllocOffset = 0;</div><div class="line"><a name="l13060"></a><span class="lineno">13060</span>&#160;                }</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;                <span class="comment">// Same block</span></div><div class="line"><a name="l13063"></a><span class="lineno">13063</span>&#160;                <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</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;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</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;                    <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize &gt; srcAllocOffset;</div><div class="line"><a name="l13068"></a><span class="lineno">13068</span>&#160;</div><div class="line"><a name="l13069"></a><span class="lineno">13069</span>&#160;                    <span class="keywordtype">bool</span> skipOver = overlap;</div><div class="line"><a name="l13070"></a><span class="lineno">13070</span>&#160;                    <span class="keywordflow">if</span>(overlap &amp;&amp; m_OverlappingMoveSupported &amp;&amp; dstAllocOffset &lt; srcAllocOffset)</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;                        <span class="comment">// If destination and source place overlap, skip if it would move it</span></div><div class="line"><a name="l13073"></a><span class="lineno">13073</span>&#160;                        <span class="comment">// by only &lt; 1/64 of its size.</span></div><div class="line"><a name="l13074"></a><span class="lineno">13074</span>&#160;                        skipOver = (srcAllocOffset - dstAllocOffset) * 64 &lt; srcAllocSize;</div><div class="line"><a name="l13075"></a><span class="lineno">13075</span>&#160;                    }</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;                    <span class="keywordflow">if</span>(skipOver)</div><div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;                    {</div><div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;                        freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</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;                        dstOffset = srcAllocOffset + srcAllocSize;</div><div class="line"><a name="l13082"></a><span class="lineno">13082</span>&#160;                        ++srcSuballocIt;</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="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div><div class="line"><a name="l13085"></a><span class="lineno">13085</span>&#160;                    <span class="keywordflow">else</span></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;                        srcSuballocIt-&gt;offset = dstAllocOffset;</div><div class="line"><a name="l13088"></a><span class="lineno">13088</span>&#160;                        srcSuballocIt-&gt;hAllocation-&gt;ChangeOffset(dstAllocOffset);</div><div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160;                        dstOffset = dstAllocOffset + srcAllocSize;</div><div class="line"><a name="l13090"></a><span class="lineno">13090</span>&#160;                        m_BytesMoved += srcAllocSize;</div><div class="line"><a name="l13091"></a><span class="lineno">13091</span>&#160;                        ++m_AllocationsMoved;</div><div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;                        ++srcSuballocIt;</div><div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;                        VmaDefragmentationMove move = {</div><div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;                            srcOrigBlockIndex, dstOrigBlockIndex,</div><div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;                            srcAllocOffset, dstAllocOffset,</div><div class="line"><a name="l13096"></a><span class="lineno">13096</span>&#160;                            srcAllocSize };</div><div class="line"><a name="l13097"></a><span class="lineno">13097</span>&#160;                        moves.push_back(move);</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;                }</div><div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;                <span class="comment">// Different block</span></div><div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;                {</div><div class="line"><a name="l13103"></a><span class="lineno">13103</span>&#160;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div><div class="line"><a name="l13104"></a><span class="lineno">13104</span>&#160;</div><div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160;                    VMA_ASSERT(dstBlockInfoIndex &lt; srcBlockInfoIndex);</div><div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;                    VMA_ASSERT(dstAllocOffset + srcAllocSize &lt;= dstBlockSize);</div><div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;</div><div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div><div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160;                    suballoc.offset = dstAllocOffset;</div><div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div><div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;                    dstOffset = dstAllocOffset + srcAllocSize;</div><div class="line"><a name="l13112"></a><span class="lineno">13112</span>&#160;                    m_BytesMoved += srcAllocSize;</div><div class="line"><a name="l13113"></a><span class="lineno">13113</span>&#160;                    ++m_AllocationsMoved;</div><div class="line"><a name="l13114"></a><span class="lineno">13114</span>&#160;</div><div class="line"><a name="l13115"></a><span class="lineno">13115</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div><div class="line"><a name="l13116"></a><span class="lineno">13116</span>&#160;                    ++nextSuballocIt;</div><div class="line"><a name="l13117"></a><span class="lineno">13117</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div><div class="line"><a name="l13118"></a><span class="lineno">13118</span>&#160;                    srcSuballocIt = nextSuballocIt;</div><div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;</div><div class="line"><a name="l13120"></a><span class="lineno">13120</span>&#160;                    pDstMetadata-&gt;m_Suballocations.push_back(suballoc);</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;                    VmaDefragmentationMove move = {</div><div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;                        srcOrigBlockIndex, dstOrigBlockIndex,</div><div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;                        srcAllocOffset, dstAllocOffset,</div><div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;                        srcAllocSize };</div><div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;                    moves.push_back(move);</div><div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160;                }</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;</div><div class="line"><a name="l13132"></a><span class="lineno">13132</span>&#160;    m_BlockInfos.clear();</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;    PostprocessMetadata();</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">return</span> VK_SUCCESS;</div><div class="line"><a name="l13137"></a><span class="lineno">13137</span>&#160;}</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;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</div><div class="line"><a name="l13140"></a><span class="lineno">13140</span>&#160;{</div><div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div><div class="line"><a name="l13142"></a><span class="lineno">13142</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="l13143"></a><span class="lineno">13143</span>&#160;    {</div><div class="line"><a name="l13144"></a><span class="lineno">13144</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div><div class="line"><a name="l13145"></a><span class="lineno">13145</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div><div class="line"><a name="l13146"></a><span class="lineno">13146</span>&#160;        pMetadata-&gt;m_FreeCount = 0;</div><div class="line"><a name="l13147"></a><span class="lineno">13147</span>&#160;        pMetadata-&gt;m_SumFreeSize = pMetadata-&gt;GetSize();</div><div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;        pMetadata-&gt;m_FreeSuballocationsBySize.clear();</div><div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div><div class="line"><a name="l13150"></a><span class="lineno">13150</span>&#160;            it != pMetadata-&gt;m_Suballocations.end(); )</div><div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;        {</div><div class="line"><a name="l13152"></a><span class="lineno">13152</span>&#160;            <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l13153"></a><span class="lineno">13153</span>&#160;            {</div><div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;                VmaSuballocationList::iterator nextIt = it;</div><div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;                ++nextIt;</div><div class="line"><a name="l13156"></a><span class="lineno">13156</span>&#160;                pMetadata-&gt;m_Suballocations.erase(it);</div><div class="line"><a name="l13157"></a><span class="lineno">13157</span>&#160;                it = nextIt;</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;                ++it;</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;    }</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;</div><div class="line"><a name="l13167"></a><span class="lineno">13167</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</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="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div><div class="line"><a name="l13170"></a><span class="lineno">13170</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="l13171"></a><span class="lineno">13171</span>&#160;    {</div><div class="line"><a name="l13172"></a><span class="lineno">13172</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div><div class="line"><a name="l13173"></a><span class="lineno">13173</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div><div class="line"><a name="l13174"></a><span class="lineno">13174</span>&#160;        <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata-&gt;GetSize();</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;        <span class="comment">// No allocations in this block - entire area is free.</span></div><div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;m_Suballocations.empty())</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;            pMetadata-&gt;m_FreeCount = 1;</div><div class="line"><a name="l13180"></a><span class="lineno">13180</span>&#160;            <span class="comment">//pMetadata-&gt;m_SumFreeSize is already set to blockSize.</span></div><div class="line"><a name="l13181"></a><span class="lineno">13181</span>&#160;            VmaSuballocation suballoc = {</div><div class="line"><a name="l13182"></a><span class="lineno">13182</span>&#160;                0, <span class="comment">// offset</span></div><div class="line"><a name="l13183"></a><span class="lineno">13183</span>&#160;                blockSize, <span class="comment">// size</span></div><div class="line"><a name="l13184"></a><span class="lineno">13184</span>&#160;                VMA_NULL, <span class="comment">// hAllocation</span></div><div class="line"><a name="l13185"></a><span class="lineno">13185</span>&#160;                VMA_SUBALLOCATION_TYPE_FREE };</div><div class="line"><a name="l13186"></a><span class="lineno">13186</span>&#160;            pMetadata-&gt;m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;            pMetadata-&gt;RegisterFreeSuballocation(pMetadata-&gt;m_Suballocations.begin());</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="comment">// There are some allocations in this block.</span></div><div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160;        <span class="keywordflow">else</span></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;            VkDeviceSize offset = 0;</div><div class="line"><a name="l13193"></a><span class="lineno">13193</span>&#160;            VmaSuballocationList::iterator it;</div><div class="line"><a name="l13194"></a><span class="lineno">13194</span>&#160;            <span class="keywordflow">for</span>(it = pMetadata-&gt;m_Suballocations.begin();</div><div class="line"><a name="l13195"></a><span class="lineno">13195</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div><div class="line"><a name="l13196"></a><span class="lineno">13196</span>&#160;                ++it)</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;                VMA_ASSERT(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;                VMA_ASSERT(it-&gt;offset &gt;= offset);</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="comment">// Need to insert preceding free space.</span></div><div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160;                <span class="keywordflow">if</span>(it-&gt;offset &gt; offset)</div><div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160;                {</div><div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160;                    ++pMetadata-&gt;m_FreeCount;</div><div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160;                    <span class="keyword">const</span> VkDeviceSize freeSize = it-&gt;offset - offset;</div><div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;                    VmaSuballocation suballoc = {</div><div class="line"><a name="l13207"></a><span class="lineno">13207</span>&#160;                        offset, <span class="comment">// offset</span></div><div class="line"><a name="l13208"></a><span class="lineno">13208</span>&#160;                        freeSize, <span class="comment">// size</span></div><div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;                        VMA_NULL, <span class="comment">// hAllocation</span></div><div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;                        VMA_SUBALLOCATION_TYPE_FREE };</div><div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;                    VmaSuballocationList::iterator precedingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div><div class="line"><a name="l13212"></a><span class="lineno">13212</span>&#160;                    <span class="keywordflow">if</span>(freeSize &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                        pMetadata-&gt;m_FreeSuballocationsBySize.push_back(precedingFreeIt);</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;                }</div><div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160;</div><div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;                pMetadata-&gt;m_SumFreeSize -= it-&gt;size;</div><div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;                offset = it-&gt;offset + it-&gt;size;</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;            <span class="comment">// Need to insert trailing free space.</span></div><div class="line"><a name="l13223"></a><span class="lineno">13223</span>&#160;            <span class="keywordflow">if</span>(offset &lt; blockSize)</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;                ++pMetadata-&gt;m_FreeCount;</div><div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;                <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div><div class="line"><a name="l13227"></a><span class="lineno">13227</span>&#160;                VmaSuballocation suballoc = {</div><div class="line"><a name="l13228"></a><span class="lineno">13228</span>&#160;                    offset, <span class="comment">// offset</span></div><div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160;                    freeSize, <span class="comment">// size</span></div><div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;                    VMA_NULL, <span class="comment">// hAllocation</span></div><div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;                    VMA_SUBALLOCATION_TYPE_FREE };</div><div class="line"><a name="l13232"></a><span class="lineno">13232</span>&#160;                VMA_ASSERT(it == pMetadata-&gt;m_Suballocations.end());</div><div class="line"><a name="l13233"></a><span class="lineno">13233</span>&#160;                VmaSuballocationList::iterator trailingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div><div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;                <span class="keywordflow">if</span>(freeSize &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160;                {</div><div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;                    pMetadata-&gt;m_FreeSuballocationsBySize.push_back(trailingFreeIt);</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;            }</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;            VMA_SORT(</div><div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.begin(),</div><div class="line"><a name="l13242"></a><span class="lineno">13242</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.end(),</div><div class="line"><a name="l13243"></a><span class="lineno">13243</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;        }</div><div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;</div><div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160;        VMA_HEAVY_ASSERT(pMetadata-&gt;Validate());</div><div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160;    }</div><div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;}</div><div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160;</div><div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc)</div><div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160;{</div><div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;    <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div><div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;    VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div><div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;    <span class="keywordflow">while</span>(it != pMetadata-&gt;m_Suballocations.end())</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;        <span class="keywordflow">if</span>(it-&gt;offset &lt; suballoc.offset)</div><div class="line"><a name="l13257"></a><span class="lineno">13257</span>&#160;        {</div><div class="line"><a name="l13258"></a><span class="lineno">13258</span>&#160;            ++it;</div><div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;        }</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;    pMetadata-&gt;m_Suballocations.insert(it, suballoc);</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;</div><div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;<span class="comment">// VmaBlockVectorDefragmentationContext</span></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;VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div><div class="line"><a name="l13268"></a><span class="lineno">13268</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l13269"></a><span class="lineno">13269</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div><div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l13271"></a><span class="lineno">13271</span>&#160;    uint32_t currFrameIndex) :</div><div class="line"><a name="l13272"></a><span class="lineno">13272</span>&#160;    res(VK_SUCCESS),</div><div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160;    mutexLocked(false),</div><div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;    blockContexts(VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l13275"></a><span class="lineno">13275</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;    m_hCustomPool(hCustomPool),</div><div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div><div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;    m_pAlgorithm(VMA_NULL),</div><div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l13281"></a><span class="lineno">13281</span>&#160;    m_AllAllocations(false)</div><div class="line"><a name="l13282"></a><span class="lineno">13282</span>&#160;{</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;</div><div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160;VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</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;    vma_delete(m_hAllocator, m_pAlgorithm);</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;</div><div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</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;    AllocInfo info = { hAlloc, pChanged };</div><div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;    m_Allocations.push_back(info);</div><div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160;}</div><div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;</div><div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported)</div><div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;{</div><div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div><div class="line"><a name="l13299"></a><span class="lineno">13299</span>&#160;        m_Allocations.size() == m_pBlockVector-&gt;CalcAllocationCount();</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="comment">/********************************</span></div><div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;<span class="comment">    HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div><div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;<span class="comment">    ********************************/</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;    <span class="comment">/*</span></div><div class="line"><a name="l13306"></a><span class="lineno">13306</span>&#160;<span class="comment">    Fast algorithm is supported only when certain criteria are met:</span></div><div class="line"><a name="l13307"></a><span class="lineno">13307</span>&#160;<span class="comment">    - VMA_DEBUG_MARGIN is 0.</span></div><div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;<span class="comment">    - All allocations in this block vector are moveable.</span></div><div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;<span class="comment">    - There is no possibility of image/buffer granularity conflict.</span></div><div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &amp;&amp;</div><div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;        allAllocations &amp;&amp;</div><div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;        !m_pBlockVector-&gt;IsBufferImageGranularityConflictPossible())</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;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div><div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</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;    <span class="keywordflow">else</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;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div><div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</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;</div><div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160;    <span class="keywordflow">if</span>(allAllocations)</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;        m_pAlgorithm-&gt;AddAll();</div><div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160;    }</div><div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160;    {</div><div class="line"><a name="l13330"></a><span class="lineno">13330</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i &lt; count; ++i)</div><div class="line"><a name="l13331"></a><span class="lineno">13331</span>&#160;        {</div><div class="line"><a name="l13332"></a><span class="lineno">13332</span>&#160;            m_pAlgorithm-&gt;AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div><div class="line"><a name="l13333"></a><span class="lineno">13333</span>&#160;        }</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;}</div><div class="line"><a name="l13336"></a><span class="lineno">13336</span>&#160;</div><div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160;<span class="comment">// VmaDefragmentationContext</span></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;VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div><div class="line"><a name="l13341"></a><span class="lineno">13341</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;    uint32_t currFrameIndex,</div><div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;    uint32_t flags,</div><div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div><div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div><div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;    m_Flags(flags),</div><div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;    m_pStats(pStats),</div><div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;    m_CustomPoolContexts(VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;{</div><div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160;    memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</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;</div><div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div><div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;{</div><div class="line"><a name="l13356"></a><span class="lineno">13356</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div><div class="line"><a name="l13357"></a><span class="lineno">13357</span>&#160;    {</div><div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div><div class="line"><a name="l13359"></a><span class="lineno">13359</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_pStats);</div><div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160;        vma_delete(m_hAllocator, pBlockVectorCtx);</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator-&gt;m_MemProps.memoryTypeCount; i--; )</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;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div><div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</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;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_pStats);</div><div class="line"><a name="l13368"></a><span class="lineno">13368</span>&#160;            vma_delete(m_hAllocator, pBlockVectorCtx);</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;    }</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;</div><div class="line"><a name="l13373"></a><span class="lineno">13373</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddPools(uint32_t poolCount, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools)</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="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</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;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div><div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;        VMA_ASSERT(pool);</div><div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;        <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div><div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;        <span class="keywordflow">if</span>(pool-&gt;m_BlockVector.GetAlgorithm() == 0)</div><div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;        {</div><div class="line"><a name="l13382"></a><span class="lineno">13382</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div><div class="line"><a name="l13383"></a><span class="lineno">13383</span>&#160;            </div><div class="line"><a name="l13384"></a><span class="lineno">13384</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div><div class="line"><a name="l13385"></a><span class="lineno">13385</span>&#160;            {</div><div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;                <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == pool)</div><div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160;                {</div><div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;                    pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div><div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160;                    <span class="keywordflow">break</span>;</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;            }</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;            <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</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;                pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div><div class="line"><a name="l13396"></a><span class="lineno">13396</span>&#160;                    m_hAllocator,</div><div class="line"><a name="l13397"></a><span class="lineno">13397</span>&#160;                    pool,</div><div class="line"><a name="l13398"></a><span class="lineno">13398</span>&#160;                    &amp;pool-&gt;m_BlockVector,</div><div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;                    m_CurrFrameIndex);</div><div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;                m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div><div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;            }</div><div class="line"><a name="l13402"></a><span class="lineno">13402</span>&#160;</div><div class="line"><a name="l13403"></a><span class="lineno">13403</span>&#160;            pBlockVectorDefragCtx-&gt;AddAll();</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;    }</div><div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;}</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;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div><div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;    uint32_t allocationCount,</div><div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l13411"></a><span class="lineno">13411</span>&#160;    VkBool32* pAllocationsChanged)</div><div class="line"><a name="l13412"></a><span class="lineno">13412</span>&#160;{</div><div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div><div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</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;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l13417"></a><span class="lineno">13417</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l13418"></a><span class="lineno">13418</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l13419"></a><span class="lineno">13419</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l13420"></a><span class="lineno">13420</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l13421"></a><span class="lineno">13421</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</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;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div><div class="line"><a name="l13424"></a><span class="lineno">13424</span>&#160;</div><div class="line"><a name="l13425"></a><span class="lineno">13425</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetBlock()-&gt;GetParentPool();</div><div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</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;                <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div><div class="line"><a name="l13430"></a><span class="lineno">13430</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</div><div class="line"><a name="l13431"></a><span class="lineno">13431</span>&#160;                {</div><div class="line"><a name="l13432"></a><span class="lineno">13432</span>&#160;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</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;                        <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == hAllocPool)</div><div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;                        {</div><div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;                            pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div><div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13438"></a><span class="lineno">13438</span>&#160;                        }</div><div class="line"><a name="l13439"></a><span class="lineno">13439</span>&#160;                    }</div><div class="line"><a name="l13440"></a><span class="lineno">13440</span>&#160;                    <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</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;                        pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div><div class="line"><a name="l13443"></a><span class="lineno">13443</span>&#160;                            m_hAllocator,</div><div class="line"><a name="l13444"></a><span class="lineno">13444</span>&#160;                            hAllocPool,</div><div class="line"><a name="l13445"></a><span class="lineno">13445</span>&#160;                            &amp;hAllocPool-&gt;m_BlockVector,</div><div class="line"><a name="l13446"></a><span class="lineno">13446</span>&#160;                            m_CurrFrameIndex);</div><div class="line"><a name="l13447"></a><span class="lineno">13447</span>&#160;                        m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div><div class="line"><a name="l13448"></a><span class="lineno">13448</span>&#160;                    }</div><div class="line"><a name="l13449"></a><span class="lineno">13449</span>&#160;                }</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;            <span class="comment">// This allocation belongs to default pool.</span></div><div class="line"><a name="l13452"></a><span class="lineno">13452</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l13455"></a><span class="lineno">13455</span>&#160;                pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div><div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160;                <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div><div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;                {</div><div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160;                    pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div><div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160;                        m_hAllocator,</div><div class="line"><a name="l13460"></a><span class="lineno">13460</span>&#160;                        VMA_NULL, <span class="comment">// hCustomPool</span></div><div class="line"><a name="l13461"></a><span class="lineno">13461</span>&#160;                        m_hAllocator-&gt;m_pBlockVectors[memTypeIndex],</div><div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;                        m_CurrFrameIndex);</div><div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;                    m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</div><div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;                }</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;</div><div class="line"><a name="l13467"></a><span class="lineno">13467</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</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;                VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l13470"></a><span class="lineno">13470</span>&#160;                    &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l13471"></a><span class="lineno">13471</span>&#160;                pBlockVectorDefragCtx-&gt;AddAllocation(hAlloc, pChanged);</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;        }</div><div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160;    }</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;</div><div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;VkResult VmaDefragmentationContext_T::Defragment(</div><div class="line"><a name="l13478"></a><span class="lineno">13478</span>&#160;    VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div><div class="line"><a name="l13479"></a><span class="lineno">13479</span>&#160;    VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div><div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160;    VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</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;    <span class="keywordflow">if</span>(pStats)</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;        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="l13485"></a><span class="lineno">13485</span>&#160;    }</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;    <span class="keywordflow">if</span>(commandBuffer == VK_NULL_HANDLE)</div><div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160;    {</div><div class="line"><a name="l13489"></a><span class="lineno">13489</span>&#160;        maxGpuBytesToMove = 0;</div><div class="line"><a name="l13490"></a><span class="lineno">13490</span>&#160;        maxGpuAllocationsToMove = 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;</div><div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l13494"></a><span class="lineno">13494</span>&#160;</div><div class="line"><a name="l13495"></a><span class="lineno">13495</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount() &amp;&amp; res &gt;= VK_SUCCESS;</div><div class="line"><a name="l13498"></a><span class="lineno">13498</span>&#160;        ++memTypeIndex)</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;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div><div class="line"><a name="l13501"></a><span class="lineno">13501</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div><div class="line"><a name="l13502"></a><span class="lineno">13502</span>&#160;        {</div><div class="line"><a name="l13503"></a><span class="lineno">13503</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div><div class="line"><a name="l13504"></a><span class="lineno">13504</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div><div class="line"><a name="l13505"></a><span class="lineno">13505</span>&#160;                pBlockVectorCtx,</div><div class="line"><a name="l13506"></a><span class="lineno">13506</span>&#160;                pStats,</div><div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;                maxCpuBytesToMove, maxCpuAllocationsToMove,</div><div class="line"><a name="l13508"></a><span class="lineno">13508</span>&#160;                maxGpuBytesToMove, maxGpuAllocationsToMove,</div><div class="line"><a name="l13509"></a><span class="lineno">13509</span>&#160;                commandBuffer);</div><div class="line"><a name="l13510"></a><span class="lineno">13510</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</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;                res = pBlockVectorCtx-&gt;res;</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;        }</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;</div><div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l13518"></a><span class="lineno">13518</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div><div class="line"><a name="l13519"></a><span class="lineno">13519</span>&#160;        customCtxIndex &lt; customCtxCount &amp;&amp; res &gt;= VK_SUCCESS;</div><div class="line"><a name="l13520"></a><span class="lineno">13520</span>&#160;        ++customCtxIndex)</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;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div><div class="line"><a name="l13523"></a><span class="lineno">13523</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div><div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div><div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160;            pBlockVectorCtx,</div><div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;            pStats,</div><div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;            maxCpuBytesToMove, maxCpuAllocationsToMove,</div><div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;            maxGpuBytesToMove, maxGpuAllocationsToMove,</div><div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;            commandBuffer);</div><div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</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;            res = pBlockVectorCtx-&gt;res;</div><div class="line"><a name="l13533"></a><span class="lineno">13533</span>&#160;        }</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;</div><div class="line"><a name="l13536"></a><span class="lineno">13536</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13537"></a><span class="lineno">13537</span>&#160;}</div><div class="line"><a name="l13538"></a><span class="lineno">13538</span>&#160;</div><div class="line"><a name="l13540"></a><span class="lineno">13540</span>&#160;<span class="comment">// VmaRecorder</span></div><div class="line"><a name="l13541"></a><span class="lineno">13541</span>&#160;</div><div class="line"><a name="l13542"></a><span class="lineno">13542</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13543"></a><span class="lineno">13543</span>&#160;</div><div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160;VmaRecorder::VmaRecorder() :</div><div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;    m_UseMutex(true),</div><div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;    m_Flags(0),</div><div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;    m_File(VMA_NULL),</div><div class="line"><a name="l13548"></a><span class="lineno">13548</span>&#160;    m_Freq(INT64_MAX),</div><div class="line"><a name="l13549"></a><span class="lineno">13549</span>&#160;    m_StartCounter(INT64_MAX)</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;}</div><div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160;</div><div class="line"><a name="l13553"></a><span class="lineno">13553</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="l13554"></a><span class="lineno">13554</span>&#160;{</div><div class="line"><a name="l13555"></a><span class="lineno">13555</span>&#160;    m_UseMutex = useMutex;</div><div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</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;    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;m_Freq);</div><div class="line"><a name="l13559"></a><span class="lineno">13559</span>&#160;    QueryPerformanceCounter((LARGE_INTEGER*)&amp;m_StartCounter);</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="comment">// Open file for writing.</span></div><div class="line"><a name="l13562"></a><span class="lineno">13562</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="l13563"></a><span class="lineno">13563</span>&#160;    <span class="keywordflow">if</span>(err != 0)</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;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;    }</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;    <span class="comment">// Write header.</span></div><div class="line"><a name="l13569"></a><span class="lineno">13569</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="l13570"></a><span class="lineno">13570</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,6&quot;</span>);</div><div class="line"><a name="l13571"></a><span class="lineno">13571</span>&#160;</div><div class="line"><a name="l13572"></a><span class="lineno">13572</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160;}</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;VmaRecorder::~VmaRecorder()</div><div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;{</div><div class="line"><a name="l13577"></a><span class="lineno">13577</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</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;        fclose(m_File);</div><div class="line"><a name="l13580"></a><span class="lineno">13580</span>&#160;    }</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;</div><div class="line"><a name="l13583"></a><span class="lineno">13583</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</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;    CallParams callParams;</div><div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;</div><div class="line"><a name="l13588"></a><span class="lineno">13588</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13589"></a><span class="lineno">13589</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="l13590"></a><span class="lineno">13590</span>&#160;    Flush();</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;</div><div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</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;    CallParams callParams;</div><div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13599"></a><span class="lineno">13599</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="l13600"></a><span class="lineno">13600</span>&#160;    Flush();</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;</div><div class="line"><a name="l13603"></a><span class="lineno">13603</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="l13604"></a><span class="lineno">13604</span>&#160;{</div><div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13606"></a><span class="lineno">13606</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13609"></a><span class="lineno">13609</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="l13610"></a><span class="lineno">13610</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div><div class="line"><a name="l13611"></a><span class="lineno">13611</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div><div class="line"><a name="l13612"></a><span class="lineno">13612</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div><div class="line"><a name="l13613"></a><span class="lineno">13613</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div><div class="line"><a name="l13614"></a><span class="lineno">13614</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div><div class="line"><a name="l13615"></a><span class="lineno">13615</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div><div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;        pool);</div><div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160;    Flush();</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="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="l13621"></a><span class="lineno">13621</span>&#160;{</div><div class="line"><a name="l13622"></a><span class="lineno">13622</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13623"></a><span class="lineno">13623</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13626"></a><span class="lineno">13626</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="l13627"></a><span class="lineno">13627</span>&#160;        pool);</div><div class="line"><a name="l13628"></a><span class="lineno">13628</span>&#160;    Flush();</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;</div><div class="line"><a name="l13631"></a><span class="lineno">13631</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l13632"></a><span class="lineno">13632</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l13633"></a><span class="lineno">13633</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="l13634"></a><span class="lineno">13634</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13635"></a><span class="lineno">13635</span>&#160;{</div><div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13637"></a><span class="lineno">13637</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13638"></a><span class="lineno">13638</span>&#160;</div><div class="line"><a name="l13639"></a><span class="lineno">13639</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13640"></a><span class="lineno">13640</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="l13641"></a><span class="lineno">13641</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="l13642"></a><span class="lineno">13642</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l13645"></a><span class="lineno">13645</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13646"></a><span class="lineno">13646</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13648"></a><span class="lineno">13648</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13649"></a><span class="lineno">13649</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;        allocation,</div><div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;    Flush();</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;</div><div class="line"><a name="l13656"></a><span class="lineno">13656</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div><div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l13658"></a><span class="lineno">13658</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="l13659"></a><span class="lineno">13659</span>&#160;    uint64_t allocationCount,</div><div class="line"><a name="l13660"></a><span class="lineno">13660</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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;    CallParams callParams;</div><div class="line"><a name="l13663"></a><span class="lineno">13663</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13666"></a><span class="lineno">13666</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="l13667"></a><span class="lineno">13667</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l13669"></a><span class="lineno">13669</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l13670"></a><span class="lineno">13670</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13676"></a><span class="lineno">13676</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div><div class="line"><a name="l13677"></a><span class="lineno">13677</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div><div class="line"><a name="l13678"></a><span class="lineno">13678</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%s\n&quot;</span>, userDataStr.GetString());</div><div class="line"><a name="l13679"></a><span class="lineno">13679</span>&#160;    Flush();</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;</div><div class="line"><a name="l13682"></a><span class="lineno">13682</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l13684"></a><span class="lineno">13684</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l13685"></a><span class="lineno">13685</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l13686"></a><span class="lineno">13686</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="l13687"></a><span class="lineno">13687</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13690"></a><span class="lineno">13690</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13693"></a><span class="lineno">13693</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="l13694"></a><span class="lineno">13694</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="l13695"></a><span class="lineno">13695</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l13696"></a><span class="lineno">13696</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13703"></a><span class="lineno">13703</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13704"></a><span class="lineno">13704</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13705"></a><span class="lineno">13705</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l13706"></a><span class="lineno">13706</span>&#160;        allocation,</div><div class="line"><a name="l13707"></a><span class="lineno">13707</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13708"></a><span class="lineno">13708</span>&#160;    Flush();</div><div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l13715"></a><span class="lineno">13715</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="l13716"></a><span class="lineno">13716</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13717"></a><span class="lineno">13717</span>&#160;{</div><div class="line"><a name="l13718"></a><span class="lineno">13718</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13719"></a><span class="lineno">13719</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13722"></a><span class="lineno">13722</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="l13723"></a><span class="lineno">13723</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="l13724"></a><span class="lineno">13724</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l13726"></a><span class="lineno">13726</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l13727"></a><span class="lineno">13727</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l13728"></a><span class="lineno">13728</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l13729"></a><span class="lineno">13729</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13730"></a><span class="lineno">13730</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13731"></a><span class="lineno">13731</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13732"></a><span class="lineno">13732</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13733"></a><span class="lineno">13733</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13734"></a><span class="lineno">13734</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l13735"></a><span class="lineno">13735</span>&#160;        allocation,</div><div class="line"><a name="l13736"></a><span class="lineno">13736</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13737"></a><span class="lineno">13737</span>&#160;    Flush();</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;</div><div class="line"><a name="l13740"></a><span class="lineno">13740</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l13741"></a><span class="lineno">13741</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13742"></a><span class="lineno">13742</span>&#160;{</div><div class="line"><a name="l13743"></a><span class="lineno">13743</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13747"></a><span class="lineno">13747</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="l13748"></a><span class="lineno">13748</span>&#160;        allocation);</div><div class="line"><a name="l13749"></a><span class="lineno">13749</span>&#160;    Flush();</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;</div><div class="line"><a name="l13752"></a><span class="lineno">13752</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div><div class="line"><a name="l13753"></a><span class="lineno">13753</span>&#160;    uint64_t allocationCount,</div><div class="line"><a name="l13754"></a><span class="lineno">13754</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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;    CallParams callParams;</div><div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemoryPages,&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div><div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;    Flush();</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;</div><div class="line"><a name="l13766"></a><span class="lineno">13766</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l13768"></a><span class="lineno">13768</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</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;    CallParams callParams;</div><div class="line"><a name="l13771"></a><span class="lineno">13771</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;</div><div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13774"></a><span class="lineno">13774</span>&#160;    UserDataString userDataStr(</div><div class="line"><a name="l13775"></a><span class="lineno">13775</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="l13776"></a><span class="lineno">13776</span>&#160;        pUserData);</div><div class="line"><a name="l13777"></a><span class="lineno">13777</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="l13778"></a><span class="lineno">13778</span>&#160;        allocation,</div><div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;    Flush();</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;</div><div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13787"></a><span class="lineno">13787</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13790"></a><span class="lineno">13790</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="l13791"></a><span class="lineno">13791</span>&#160;        allocation);</div><div class="line"><a name="l13792"></a><span class="lineno">13792</span>&#160;    Flush();</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> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l13796"></a><span class="lineno">13796</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160;</div><div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13802"></a><span class="lineno">13802</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="l13803"></a><span class="lineno">13803</span>&#160;        allocation);</div><div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;    Flush();</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> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l13808"></a><span class="lineno">13808</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;{</div><div class="line"><a name="l13810"></a><span class="lineno">13810</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13811"></a><span class="lineno">13811</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13814"></a><span class="lineno">13814</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="l13815"></a><span class="lineno">13815</span>&#160;        allocation);</div><div class="line"><a name="l13816"></a><span class="lineno">13816</span>&#160;    Flush();</div><div class="line"><a name="l13817"></a><span class="lineno">13817</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l13820"></a><span class="lineno">13820</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</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;    CallParams callParams;</div><div class="line"><a name="l13823"></a><span class="lineno">13823</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13826"></a><span class="lineno">13826</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="l13827"></a><span class="lineno">13827</span>&#160;        allocation,</div><div class="line"><a name="l13828"></a><span class="lineno">13828</span>&#160;        offset,</div><div class="line"><a name="l13829"></a><span class="lineno">13829</span>&#160;        size);</div><div class="line"><a name="l13830"></a><span class="lineno">13830</span>&#160;    Flush();</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;</div><div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</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;    CallParams callParams;</div><div class="line"><a name="l13837"></a><span class="lineno">13837</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;</div><div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13840"></a><span class="lineno">13840</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="l13841"></a><span class="lineno">13841</span>&#160;        allocation,</div><div class="line"><a name="l13842"></a><span class="lineno">13842</span>&#160;        offset,</div><div class="line"><a name="l13843"></a><span class="lineno">13843</span>&#160;        size);</div><div class="line"><a name="l13844"></a><span class="lineno">13844</span>&#160;    Flush();</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;</div><div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l13849"></a><span class="lineno">13849</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="l13850"></a><span class="lineno">13850</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13853"></a><span class="lineno">13853</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13856"></a><span class="lineno">13856</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="l13857"></a><span class="lineno">13857</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="l13858"></a><span class="lineno">13858</span>&#160;        bufCreateInfo.flags,</div><div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;        bufCreateInfo.size,</div><div class="line"><a name="l13860"></a><span class="lineno">13860</span>&#160;        bufCreateInfo.usage,</div><div class="line"><a name="l13861"></a><span class="lineno">13861</span>&#160;        bufCreateInfo.sharingMode,</div><div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13863"></a><span class="lineno">13863</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13864"></a><span class="lineno">13864</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;        allocation,</div><div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;    Flush();</div><div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l13874"></a><span class="lineno">13874</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l13875"></a><span class="lineno">13875</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="l13876"></a><span class="lineno">13876</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13879"></a><span class="lineno">13879</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13882"></a><span class="lineno">13882</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="l13883"></a><span class="lineno">13883</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="l13884"></a><span class="lineno">13884</span>&#160;        imageCreateInfo.flags,</div><div class="line"><a name="l13885"></a><span class="lineno">13885</span>&#160;        imageCreateInfo.imageType,</div><div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;        imageCreateInfo.format,</div><div class="line"><a name="l13887"></a><span class="lineno">13887</span>&#160;        imageCreateInfo.extent.width,</div><div class="line"><a name="l13888"></a><span class="lineno">13888</span>&#160;        imageCreateInfo.extent.height,</div><div class="line"><a name="l13889"></a><span class="lineno">13889</span>&#160;        imageCreateInfo.extent.depth,</div><div class="line"><a name="l13890"></a><span class="lineno">13890</span>&#160;        imageCreateInfo.mipLevels,</div><div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;        imageCreateInfo.arrayLayers,</div><div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160;        imageCreateInfo.samples,</div><div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;        imageCreateInfo.tiling,</div><div class="line"><a name="l13894"></a><span class="lineno">13894</span>&#160;        imageCreateInfo.usage,</div><div class="line"><a name="l13895"></a><span class="lineno">13895</span>&#160;        imageCreateInfo.sharingMode,</div><div class="line"><a name="l13896"></a><span class="lineno">13896</span>&#160;        imageCreateInfo.initialLayout,</div><div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160;        allocation,</div><div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l13905"></a><span class="lineno">13905</span>&#160;    Flush();</div><div class="line"><a name="l13906"></a><span class="lineno">13906</span>&#160;}</div><div class="line"><a name="l13907"></a><span class="lineno">13907</span>&#160;</div><div class="line"><a name="l13908"></a><span class="lineno">13908</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l13909"></a><span class="lineno">13909</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13912"></a><span class="lineno">13912</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13913"></a><span class="lineno">13913</span>&#160;</div><div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13915"></a><span class="lineno">13915</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="l13916"></a><span class="lineno">13916</span>&#160;        allocation);</div><div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;    Flush();</div><div class="line"><a name="l13918"></a><span class="lineno">13918</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l13921"></a><span class="lineno">13921</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13927"></a><span class="lineno">13927</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="l13928"></a><span class="lineno">13928</span>&#160;        allocation);</div><div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160;    Flush();</div><div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l13933"></a><span class="lineno">13933</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13934"></a><span class="lineno">13934</span>&#160;{</div><div class="line"><a name="l13935"></a><span class="lineno">13935</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13936"></a><span class="lineno">13936</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;</div><div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13939"></a><span class="lineno">13939</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="l13940"></a><span class="lineno">13940</span>&#160;        allocation);</div><div class="line"><a name="l13941"></a><span class="lineno">13941</span>&#160;    Flush();</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;</div><div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div><div class="line"><a name="l13948"></a><span class="lineno">13948</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13949"></a><span class="lineno">13949</span>&#160;</div><div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13951"></a><span class="lineno">13951</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="l13952"></a><span class="lineno">13952</span>&#160;        allocation);</div><div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;    Flush();</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;</div><div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</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;    CallParams callParams;</div><div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13963"></a><span class="lineno">13963</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="l13964"></a><span class="lineno">13964</span>&#160;        pool);</div><div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;    Flush();</div><div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;}</div><div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160;</div><div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div><div class="line"><a name="l13969"></a><span class="lineno">13969</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="l13970"></a><span class="lineno">13970</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</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;    CallParams callParams;</div><div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160;</div><div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13976"></a><span class="lineno">13976</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationBegin,%u,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l13977"></a><span class="lineno">13977</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div><div class="line"><a name="l13978"></a><span class="lineno">13978</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>);</div><div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,&quot;</span>);</div><div class="line"><a name="l13980"></a><span class="lineno">13980</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>);</div><div class="line"><a name="l13981"></a><span class="lineno">13981</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%llu,%u,%llu,%u,%p,%p\n&quot;</span>,</div><div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div><div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div><div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div><div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div><div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div><div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;        ctx);</div><div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;    Flush();</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;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div><div class="line"><a name="l13992"></a><span class="lineno">13992</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div><div class="line"><a name="l13993"></a><span class="lineno">13993</span>&#160;{</div><div class="line"><a name="l13994"></a><span class="lineno">13994</span>&#160;    CallParams callParams;</div><div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationEnd,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160;        ctx);</div><div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;    Flush();</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;</div><div class="line"><a name="l14003"></a><span class="lineno">14003</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="l14004"></a><span class="lineno">14004</span>&#160;{</div><div class="line"><a name="l14005"></a><span class="lineno">14005</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</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="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="l14008"></a><span class="lineno">14008</span>&#160;        {</div><div class="line"><a name="l14009"></a><span class="lineno">14009</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l14010"></a><span class="lineno">14010</span>&#160;        }</div><div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160;        {</div><div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160;            sprintf_s(m_PtrStr, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div><div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160;            m_Str = m_PtrStr;</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;    }</div><div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;    <span class="keywordflow">else</span></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;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160;    }</div><div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;}</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="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div><div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l14026"></a><span class="lineno">14026</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div><div class="line"><a name="l14027"></a><span class="lineno">14027</span>&#160;    <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled)</div><div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;{</div><div class="line"><a name="l14029"></a><span class="lineno">14029</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</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;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div><div class="line"><a name="l14032"></a><span class="lineno">14032</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div><div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div><div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div><div class="line"><a name="l14035"></a><span class="lineno">14035</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div><div class="line"><a name="l14036"></a><span class="lineno">14036</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</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;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div><div class="line"><a name="l14039"></a><span class="lineno">14039</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div><div class="line"><a name="l14040"></a><span class="lineno">14040</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div><div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;</div><div class="line"><a name="l14042"></a><span class="lineno">14042</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div><div class="line"><a name="l14043"></a><span class="lineno">14043</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</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;        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="l14046"></a><span class="lineno">14046</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="l14047"></a><span class="lineno">14047</span>&#160;    }</div><div class="line"><a name="l14048"></a><span class="lineno">14048</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div><div class="line"><a name="l14049"></a><span class="lineno">14049</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div><div class="line"><a name="l14050"></a><span class="lineno">14050</span>&#160;    {</div><div class="line"><a name="l14051"></a><span class="lineno">14051</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="l14052"></a><span class="lineno">14052</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="l14053"></a><span class="lineno">14053</span>&#160;    }</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;    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="l14056"></a><span class="lineno">14056</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_bind_memory2,%u\n&quot;</span>, bindMemory2ExtensionEnabled ? 1 : 0);</div><div class="line"><a name="l14057"></a><span class="lineno">14057</span>&#160;</div><div class="line"><a name="l14058"></a><span class="lineno">14058</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="l14059"></a><span class="lineno">14059</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="l14060"></a><span class="lineno">14060</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="l14061"></a><span class="lineno">14061</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="l14062"></a><span class="lineno">14062</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="l14063"></a><span class="lineno">14063</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="l14064"></a><span class="lineno">14064</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="l14065"></a><span class="lineno">14065</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="l14066"></a><span class="lineno">14066</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="l14067"></a><span class="lineno">14067</span>&#160;</div><div class="line"><a name="l14068"></a><span class="lineno">14068</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</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;</div><div class="line"><a name="l14071"></a><span class="lineno">14071</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</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;    outParams.threadId = GetCurrentThreadId();</div><div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160;</div><div class="line"><a name="l14075"></a><span class="lineno">14075</span>&#160;    LARGE_INTEGER counter;</div><div class="line"><a name="l14076"></a><span class="lineno">14076</span>&#160;    QueryPerformanceCounter(&amp;counter);</div><div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div><div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160;}</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="keywordtype">void</span> VmaRecorder::PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems)</div><div class="line"><a name="l14081"></a><span class="lineno">14081</span>&#160;{</div><div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160;    <span class="keywordflow">if</span>(count)</div><div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;    {</div><div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div><div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160;        <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</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;            fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</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;}</div><div class="line"><a name="l14091"></a><span class="lineno">14091</span>&#160;</div><div class="line"><a name="l14092"></a><span class="lineno">14092</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div><div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;{</div><div class="line"><a name="l14094"></a><span class="lineno">14094</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="l14095"></a><span class="lineno">14095</span>&#160;    {</div><div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;        fflush(m_File);</div><div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160;    }</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;</div><div class="line"><a name="l14100"></a><span class="lineno">14100</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14101"></a><span class="lineno">14101</span>&#160;</div><div class="line"><a name="l14103"></a><span class="lineno">14103</span>&#160;<span class="comment">// VmaAllocationObjectAllocator</span></div><div class="line"><a name="l14104"></a><span class="lineno">14104</span>&#160;</div><div class="line"><a name="l14105"></a><span class="lineno">14105</span>&#160;VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l14106"></a><span class="lineno">14106</span>&#160;    m_Allocator(pAllocationCallbacks, 1024)</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;}</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;<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate()</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;    VmaMutexLock mutexLock(m_Mutex);</div><div class="line"><a name="l14113"></a><span class="lineno">14113</span>&#160;    <span class="keywordflow">return</span> m_Allocator.Alloc();</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;</div><div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;<span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</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;    VmaMutexLock mutexLock(m_Mutex);</div><div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160;    m_Allocator.Free(hAlloc);</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;</div><div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;<span class="comment">// VmaAllocator_T</span></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;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="l14126"></a><span class="lineno">14126</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="l14127"></a><span class="lineno">14127</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="l14128"></a><span class="lineno">14128</span>&#160;    m_UseKhrBindMemory2((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0),</div><div class="line"><a name="l14129"></a><span class="lineno">14129</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l14130"></a><span class="lineno">14130</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l14131"></a><span class="lineno">14131</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l14132"></a><span class="lineno">14132</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;    m_AllocationObjectAllocator(&amp;m_AllocationCallbacks),</div><div class="line"><a name="l14134"></a><span class="lineno">14134</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l14135"></a><span class="lineno">14135</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l14136"></a><span class="lineno">14136</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l14137"></a><span class="lineno">14137</span>&#160;    m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div><div class="line"><a name="l14138"></a><span class="lineno">14138</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div><div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;    m_NextPoolId(0)</div><div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;    ,m_pRecorder(VMA_NULL)</div><div class="line"><a name="l14142"></a><span class="lineno">14142</span>&#160;#endif</div><div class="line"><a name="l14143"></a><span class="lineno">14143</span>&#160;{</div><div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</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;        <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="l14147"></a><span class="lineno">14147</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</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;</div><div class="line"><a name="l14150"></a><span class="lineno">14150</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="l14151"></a><span class="lineno">14151</span>&#160;</div><div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l14153"></a><span class="lineno">14153</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="l14154"></a><span class="lineno">14154</span>&#160;    {</div><div class="line"><a name="l14155"></a><span class="lineno">14155</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="l14156"></a><span class="lineno">14156</span>&#160;    }</div><div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;<span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div><div class="line"><a name="l14159"></a><span class="lineno">14159</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#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0)</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</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">#endif</span></div><div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160;</div><div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</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;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l14170"></a><span class="lineno">14170</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</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;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</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;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;    }</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;    <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="l14178"></a><span class="lineno">14178</span>&#160;    {</div><div class="line"><a name="l14179"></a><span class="lineno">14179</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="l14180"></a><span class="lineno">14180</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="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;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l14184"></a><span class="lineno">14184</span>&#160;</div><div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</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(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l14189"></a><span class="lineno">14189</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div><div class="line"><a name="l14190"></a><span class="lineno">14190</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div><div class="line"><a name="l14191"></a><span class="lineno">14191</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div><div class="line"><a name="l14192"></a><span class="lineno">14192</span>&#160;</div><div class="line"><a name="l14193"></a><span class="lineno">14193</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="l14194"></a><span class="lineno">14194</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="l14195"></a><span class="lineno">14195</span>&#160;</div><div class="line"><a name="l14196"></a><span class="lineno">14196</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="l14197"></a><span class="lineno">14197</span>&#160;    {</div><div class="line"><a name="l14198"></a><span class="lineno">14198</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</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;            <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="l14201"></a><span class="lineno">14201</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</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;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l14204"></a><span class="lineno">14204</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l14205"></a><span class="lineno">14205</span>&#160;                {</div><div class="line"><a name="l14206"></a><span class="lineno">14206</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</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;            }</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;    }</div><div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;</div><div class="line"><a name="l14212"></a><span class="lineno">14212</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</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;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</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;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l14217"></a><span class="lineno">14217</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l14218"></a><span class="lineno">14218</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div><div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160;            memTypeIndex,</div><div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l14221"></a><span class="lineno">14221</span>&#160;            0,</div><div class="line"><a name="l14222"></a><span class="lineno">14222</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l14223"></a><span class="lineno">14223</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l14224"></a><span class="lineno">14224</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;            <span class="keyword">false</span>, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;            <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div><div class="line"><a name="l14228"></a><span class="lineno">14228</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l14229"></a><span class="lineno">14229</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</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;    }</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;</div><div class="line"><a name="l14235"></a><span class="lineno">14235</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="l14236"></a><span class="lineno">14236</span>&#160;{</div><div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160;    VkResult res = VK_SUCCESS;</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;    <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="l14240"></a><span class="lineno">14240</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="l14241"></a><span class="lineno">14241</span>&#160;    {</div><div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14243"></a><span class="lineno">14243</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div><div class="line"><a name="l14244"></a><span class="lineno">14244</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="l14245"></a><span class="lineno">14245</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</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;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14248"></a><span class="lineno">14248</span>&#160;        }</div><div class="line"><a name="l14249"></a><span class="lineno">14249</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div><div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160;            m_PhysicalDeviceProperties,</div><div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;            m_MemProps,</div><div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;            m_UseKhrDedicatedAllocation,</div><div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;            m_UseKhrBindMemory2);</div><div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l14255"></a><span class="lineno">14255</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l14256"></a><span class="lineno">14256</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="l14257"></a><span class="lineno">14257</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l14258"></a><span class="lineno">14258</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;    }</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;    <span class="keywordflow">return</span> res;</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;</div><div class="line"><a name="l14264"></a><span class="lineno">14264</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l14265"></a><span class="lineno">14265</span>&#160;{</div><div class="line"><a name="l14266"></a><span class="lineno">14266</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14267"></a><span class="lineno">14267</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div><div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;    {</div><div class="line"><a name="l14269"></a><span class="lineno">14269</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l14270"></a><span class="lineno">14270</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</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;<span class="preprocessor">#endif</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_ASSERT(m_Pools.empty());</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</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="keywordflow">if</span>(m_pDedicatedAllocations[i] != VMA_NULL &amp;&amp; !m_pDedicatedAllocations[i]-&gt;empty())</div><div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;        {</div><div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unfreed dedicated allocations found.&quot;</span>);</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;</div><div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l14284"></a><span class="lineno">14284</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l14285"></a><span class="lineno">14285</span>&#160;    }</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> 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="l14289"></a><span class="lineno">14289</span>&#160;{</div><div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l14291"></a><span class="lineno">14291</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l14292"></a><span class="lineno">14292</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160;    m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div><div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160;    m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div><div class="line"><a name="l14295"></a><span class="lineno">14295</span>&#160;    m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div><div class="line"><a name="l14296"></a><span class="lineno">14296</span>&#160;    m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div><div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div><div class="line"><a name="l14298"></a><span class="lineno">14298</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div><div class="line"><a name="l14299"></a><span class="lineno">14299</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div><div class="line"><a name="l14300"></a><span class="lineno">14300</span>&#160;    m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div><div class="line"><a name="l14301"></a><span class="lineno">14301</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div><div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div><div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;    m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div><div class="line"><a name="l14304"></a><span class="lineno">14304</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div><div class="line"><a name="l14305"></a><span class="lineno">14305</span>&#160;    m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div><div class="line"><a name="l14306"></a><span class="lineno">14306</span>&#160;    m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div><div class="line"><a name="l14307"></a><span class="lineno">14307</span>&#160;    m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div><div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14309"></a><span class="lineno">14309</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l14310"></a><span class="lineno">14310</span>&#160;    {</div><div class="line"><a name="l14311"></a><span class="lineno">14311</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l14312"></a><span class="lineno">14312</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l14313"></a><span class="lineno">14313</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l14314"></a><span class="lineno">14314</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</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="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14317"></a><span class="lineno">14317</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l14318"></a><span class="lineno">14318</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div><div class="line"><a name="l14319"></a><span class="lineno">14319</span>&#160;    {</div><div class="line"><a name="l14320"></a><span class="lineno">14320</span>&#160;        m_VulkanFunctions.vkBindBufferMemory2KHR =</div><div class="line"><a name="l14321"></a><span class="lineno">14321</span>&#160;            (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkBindBufferMemory2KHR&quot;</span>);</div><div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;        m_VulkanFunctions.vkBindImageMemory2KHR =</div><div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;            (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkBindImageMemory2KHR&quot;</span>);</div><div class="line"><a name="l14324"></a><span class="lineno">14324</span>&#160;    }</div><div class="line"><a name="l14325"></a><span class="lineno">14325</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l14326"></a><span class="lineno">14326</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></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;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l14329"></a><span class="lineno">14329</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</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;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</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;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l14335"></a><span class="lineno">14335</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l14336"></a><span class="lineno">14336</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div><div class="line"><a name="l14340"></a><span class="lineno">14340</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div><div class="line"><a name="l14341"></a><span class="lineno">14341</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l14342"></a><span class="lineno">14342</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l14343"></a><span class="lineno">14343</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l14344"></a><span class="lineno">14344</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l14345"></a><span class="lineno">14345</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l14348"></a><span class="lineno">14348</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l14349"></a><span class="lineno">14349</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div><div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14351"></a><span class="lineno">14351</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l14352"></a><span class="lineno">14352</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l14353"></a><span class="lineno">14353</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14354"></a><span class="lineno">14354</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div><div class="line"><a name="l14356"></a><span class="lineno">14356</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div><div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;<span class="preprocessor">#endif</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;</div><div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l14361"></a><span class="lineno">14361</span>&#160;</div><div class="line"><a name="l14362"></a><span class="lineno">14362</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="l14363"></a><span class="lineno">14363</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l14364"></a><span class="lineno">14364</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l14365"></a><span class="lineno">14365</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l14366"></a><span class="lineno">14366</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l14367"></a><span class="lineno">14367</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l14368"></a><span class="lineno">14368</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l14369"></a><span class="lineno">14369</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l14371"></a><span class="lineno">14371</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l14372"></a><span class="lineno">14372</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l14375"></a><span class="lineno">14375</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l14376"></a><span class="lineno">14376</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l14378"></a><span class="lineno">14378</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l14379"></a><span class="lineno">14379</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l14380"></a><span class="lineno">14380</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div><div class="line"><a name="l14381"></a><span class="lineno">14381</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14382"></a><span class="lineno">14382</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</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;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l14385"></a><span class="lineno">14385</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;    }</div><div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</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;        VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div><div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</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="preprocessor">#endif</span></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;</div><div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;{</div><div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l14400"></a><span class="lineno">14400</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l14401"></a><span class="lineno">14401</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="l14402"></a><span class="lineno">14402</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l14403"></a><span class="lineno">14403</span>&#160;}</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;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l14406"></a><span class="lineno">14406</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l14407"></a><span class="lineno">14407</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l14408"></a><span class="lineno">14408</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l14410"></a><span class="lineno">14410</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l14411"></a><span class="lineno">14411</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="l14412"></a><span class="lineno">14412</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l14413"></a><span class="lineno">14413</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div><div class="line"><a name="l14416"></a><span class="lineno">14416</span>&#160;{</div><div class="line"><a name="l14417"></a><span class="lineno">14417</span>&#160;    VMA_ASSERT(pAllocations != VMA_NULL);</div><div class="line"><a name="l14418"></a><span class="lineno">14418</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu&quot;</span>, memTypeIndex, allocationCount, size);</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;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l14421"></a><span class="lineno">14421</span>&#160;</div><div class="line"><a name="l14422"></a><span class="lineno">14422</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l14423"></a><span class="lineno">14423</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="l14424"></a><span class="lineno">14424</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;    {</div><div class="line"><a name="l14426"></a><span class="lineno">14426</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="l14427"></a><span class="lineno">14427</span>&#160;    }</div><div class="line"><a name="l14428"></a><span class="lineno">14428</span>&#160;</div><div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;    VMA_ASSERT(blockVector);</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;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l14436"></a><span class="lineno">14436</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="l14437"></a><span class="lineno">14437</span>&#160;        size &gt; preferredBlockSize / 2;</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="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l14440"></a><span class="lineno">14440</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="l14441"></a><span class="lineno">14441</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="l14442"></a><span class="lineno">14442</span>&#160;    {</div><div class="line"><a name="l14443"></a><span class="lineno">14443</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="l14444"></a><span class="lineno">14444</span>&#160;    }</div><div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160;</div><div class="line"><a name="l14446"></a><span class="lineno">14446</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="l14447"></a><span class="lineno">14447</span>&#160;    {</div><div class="line"><a name="l14448"></a><span class="lineno">14448</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="l14449"></a><span class="lineno">14449</span>&#160;        {</div><div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14451"></a><span class="lineno">14451</span>&#160;        }</div><div class="line"><a name="l14452"></a><span class="lineno">14452</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l14453"></a><span class="lineno">14453</span>&#160;        {</div><div class="line"><a name="l14454"></a><span class="lineno">14454</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l14455"></a><span class="lineno">14455</span>&#160;                size,</div><div class="line"><a name="l14456"></a><span class="lineno">14456</span>&#160;                suballocType,</div><div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160;                memTypeIndex,</div><div class="line"><a name="l14458"></a><span class="lineno">14458</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="l14459"></a><span class="lineno">14459</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="l14460"></a><span class="lineno">14460</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160;                dedicatedImage,</div><div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;                allocationCount,</div><div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;                pAllocations);</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;    }</div><div class="line"><a name="l14467"></a><span class="lineno">14467</span>&#160;    <span class="keywordflow">else</span></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;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l14470"></a><span class="lineno">14470</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l14471"></a><span class="lineno">14471</span>&#160;            size,</div><div class="line"><a name="l14472"></a><span class="lineno">14472</span>&#160;            alignment,</div><div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l14474"></a><span class="lineno">14474</span>&#160;            suballocType,</div><div class="line"><a name="l14475"></a><span class="lineno">14475</span>&#160;            allocationCount,</div><div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;            pAllocations);</div><div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</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="keywordflow">return</span> res;</div><div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;        }</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;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l14483"></a><span class="lineno">14483</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="l14484"></a><span class="lineno">14484</span>&#160;        {</div><div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</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="keywordflow">else</span></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;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l14490"></a><span class="lineno">14490</span>&#160;                size,</div><div class="line"><a name="l14491"></a><span class="lineno">14491</span>&#160;                suballocType,</div><div class="line"><a name="l14492"></a><span class="lineno">14492</span>&#160;                memTypeIndex,</div><div class="line"><a name="l14493"></a><span class="lineno">14493</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="l14494"></a><span class="lineno">14494</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="l14495"></a><span class="lineno">14495</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l14497"></a><span class="lineno">14497</span>&#160;                dedicatedImage,</div><div class="line"><a name="l14498"></a><span class="lineno">14498</span>&#160;                allocationCount,</div><div class="line"><a name="l14499"></a><span class="lineno">14499</span>&#160;                pAllocations);</div><div class="line"><a name="l14500"></a><span class="lineno">14500</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l14501"></a><span class="lineno">14501</span>&#160;            {</div><div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l14503"></a><span class="lineno">14503</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l14504"></a><span class="lineno">14504</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l14507"></a><span class="lineno">14507</span>&#160;            {</div><div class="line"><a name="l14508"></a><span class="lineno">14508</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l14510"></a><span class="lineno">14510</span>&#160;                <span class="keywordflow">return</span> res;</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;        }</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;}</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;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l14518"></a><span class="lineno">14518</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l14519"></a><span class="lineno">14519</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l14522"></a><span class="lineno">14522</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l14523"></a><span class="lineno">14523</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l14524"></a><span class="lineno">14524</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l14525"></a><span class="lineno">14525</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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_ASSERT(allocationCount &gt; 0 &amp;&amp; pAllocations);</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;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l14531"></a><span class="lineno">14531</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l14532"></a><span class="lineno">14532</span>&#160;    allocInfo.allocationSize = size;</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;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l14536"></a><span class="lineno">14536</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</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;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</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;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l14541"></a><span class="lineno">14541</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l14542"></a><span class="lineno">14542</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l14543"></a><span class="lineno">14543</span>&#160;        }</div><div class="line"><a name="l14544"></a><span class="lineno">14544</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l14545"></a><span class="lineno">14545</span>&#160;        {</div><div class="line"><a name="l14546"></a><span class="lineno">14546</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l14547"></a><span class="lineno">14547</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l14548"></a><span class="lineno">14548</span>&#160;        }</div><div class="line"><a name="l14549"></a><span class="lineno">14549</span>&#160;    }</div><div class="line"><a name="l14550"></a><span class="lineno">14550</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></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;    <span class="keywordtype">size_t</span> allocIndex;</div><div class="line"><a name="l14553"></a><span class="lineno">14553</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l14554"></a><span class="lineno">14554</span>&#160;    <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l14555"></a><span class="lineno">14555</span>&#160;    {</div><div class="line"><a name="l14556"></a><span class="lineno">14556</span>&#160;        res = AllocateDedicatedMemoryPage(</div><div class="line"><a name="l14557"></a><span class="lineno">14557</span>&#160;            size,</div><div class="line"><a name="l14558"></a><span class="lineno">14558</span>&#160;            suballocType,</div><div class="line"><a name="l14559"></a><span class="lineno">14559</span>&#160;            memTypeIndex,</div><div class="line"><a name="l14560"></a><span class="lineno">14560</span>&#160;            allocInfo,</div><div class="line"><a name="l14561"></a><span class="lineno">14561</span>&#160;            map,</div><div class="line"><a name="l14562"></a><span class="lineno">14562</span>&#160;            isUserDataString,</div><div class="line"><a name="l14563"></a><span class="lineno">14563</span>&#160;            pUserData,</div><div class="line"><a name="l14564"></a><span class="lineno">14564</span>&#160;            pAllocations + allocIndex);</div><div class="line"><a name="l14565"></a><span class="lineno">14565</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l14566"></a><span class="lineno">14566</span>&#160;        {</div><div class="line"><a name="l14567"></a><span class="lineno">14567</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l14568"></a><span class="lineno">14568</span>&#160;        }</div><div class="line"><a name="l14569"></a><span class="lineno">14569</span>&#160;    }</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="keywordflow">if</span>(res == VK_SUCCESS)</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="comment">// Register them in m_pDedicatedAllocations.</span></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;            VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l14576"></a><span class="lineno">14576</span>&#160;            AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l14577"></a><span class="lineno">14577</span>&#160;            VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l14578"></a><span class="lineno">14578</span>&#160;            <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l14579"></a><span class="lineno">14579</span>&#160;            {</div><div class="line"><a name="l14580"></a><span class="lineno">14580</span>&#160;                VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, pAllocations[allocIndex]);</div><div class="line"><a name="l14581"></a><span class="lineno">14581</span>&#160;            }</div><div class="line"><a name="l14582"></a><span class="lineno">14582</span>&#160;        }</div><div class="line"><a name="l14583"></a><span class="lineno">14583</span>&#160;</div><div class="line"><a name="l14584"></a><span class="lineno">14584</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u&quot;</span>, allocationCount, memTypeIndex);</div><div class="line"><a name="l14585"></a><span class="lineno">14585</span>&#160;    }</div><div class="line"><a name="l14586"></a><span class="lineno">14586</span>&#160;    <span class="keywordflow">else</span></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="comment">// Free all already created allocations.</span></div><div class="line"><a name="l14589"></a><span class="lineno">14589</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div><div class="line"><a name="l14590"></a><span class="lineno">14590</span>&#160;        {</div><div class="line"><a name="l14591"></a><span class="lineno">14591</span>&#160;            <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l14592"></a><span class="lineno">14592</span>&#160;            VkDeviceMemory hMemory = currAlloc-&gt;GetMemory();</div><div class="line"><a name="l14593"></a><span class="lineno">14593</span>&#160;    </div><div class="line"><a name="l14594"></a><span class="lineno">14594</span>&#160;            <span class="comment">/*</span></div><div class="line"><a name="l14595"></a><span class="lineno">14595</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="l14596"></a><span class="lineno">14596</span>&#160;<span class="comment">            before vkFreeMemory.</span></div><div class="line"><a name="l14597"></a><span class="lineno">14597</span>&#160;<span class="comment"></span></div><div class="line"><a name="l14598"></a><span class="lineno">14598</span>&#160;<span class="comment">            if(currAlloc-&gt;GetMappedData() != VMA_NULL)</span></div><div class="line"><a name="l14599"></a><span class="lineno">14599</span>&#160;<span class="comment">            {</span></div><div class="line"><a name="l14600"></a><span class="lineno">14600</span>&#160;<span class="comment">                (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div><div class="line"><a name="l14601"></a><span class="lineno">14601</span>&#160;<span class="comment">            }</span></div><div class="line"><a name="l14602"></a><span class="lineno">14602</span>&#160;<span class="comment">            */</span></div><div class="line"><a name="l14603"></a><span class="lineno">14603</span>&#160;    </div><div class="line"><a name="l14604"></a><span class="lineno">14604</span>&#160;            FreeVulkanMemory(memTypeIndex, currAlloc-&gt;GetSize(), hMemory);</div><div class="line"><a name="l14605"></a><span class="lineno">14605</span>&#160;</div><div class="line"><a name="l14606"></a><span class="lineno">14606</span>&#160;            currAlloc-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l14607"></a><span class="lineno">14607</span>&#160;            currAlloc-&gt;Dtor();</div><div class="line"><a name="l14608"></a><span class="lineno">14608</span>&#160;            m_AllocationObjectAllocator.Free(currAlloc);</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;</div><div class="line"><a name="l14611"></a><span class="lineno">14611</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div><div class="line"><a name="l14612"></a><span class="lineno">14612</span>&#160;    }</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;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14615"></a><span class="lineno">14615</span>&#160;}</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;VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div><div class="line"><a name="l14618"></a><span class="lineno">14618</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l14619"></a><span class="lineno">14619</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l14620"></a><span class="lineno">14620</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l14621"></a><span class="lineno">14621</span>&#160;    <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div><div class="line"><a name="l14622"></a><span class="lineno">14622</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l14623"></a><span class="lineno">14623</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l14624"></a><span class="lineno">14624</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l14625"></a><span class="lineno">14625</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l14626"></a><span class="lineno">14626</span>&#160;{</div><div class="line"><a name="l14627"></a><span class="lineno">14627</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l14628"></a><span class="lineno">14628</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l14629"></a><span class="lineno">14629</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l14630"></a><span class="lineno">14630</span>&#160;    {</div><div class="line"><a name="l14631"></a><span class="lineno">14631</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l14632"></a><span class="lineno">14632</span>&#160;        <span class="keywordflow">return</span> res;</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;</div><div class="line"><a name="l14635"></a><span class="lineno">14635</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l14636"></a><span class="lineno">14636</span>&#160;    <span class="keywordflow">if</span>(map)</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;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l14639"></a><span class="lineno">14639</span>&#160;            m_hDevice,</div><div class="line"><a name="l14640"></a><span class="lineno">14640</span>&#160;            hMemory,</div><div class="line"><a name="l14641"></a><span class="lineno">14641</span>&#160;            0,</div><div class="line"><a name="l14642"></a><span class="lineno">14642</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l14643"></a><span class="lineno">14643</span>&#160;            0,</div><div class="line"><a name="l14644"></a><span class="lineno">14644</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l14645"></a><span class="lineno">14645</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l14646"></a><span class="lineno">14646</span>&#160;        {</div><div class="line"><a name="l14647"></a><span class="lineno">14647</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l14648"></a><span class="lineno">14648</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l14649"></a><span class="lineno">14649</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14650"></a><span class="lineno">14650</span>&#160;        }</div><div class="line"><a name="l14651"></a><span class="lineno">14651</span>&#160;    }</div><div class="line"><a name="l14652"></a><span class="lineno">14652</span>&#160;</div><div class="line"><a name="l14653"></a><span class="lineno">14653</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate();</div><div class="line"><a name="l14654"></a><span class="lineno">14654</span>&#160;    (*pAllocation)-&gt;Ctor(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l14655"></a><span class="lineno">14655</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l14656"></a><span class="lineno">14656</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l14657"></a><span class="lineno">14657</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l14658"></a><span class="lineno">14658</span>&#160;    {</div><div class="line"><a name="l14659"></a><span class="lineno">14659</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l14660"></a><span class="lineno">14660</span>&#160;    }</div><div class="line"><a name="l14661"></a><span class="lineno">14661</span>&#160;</div><div class="line"><a name="l14662"></a><span class="lineno">14662</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14663"></a><span class="lineno">14663</span>&#160;}</div><div class="line"><a name="l14664"></a><span class="lineno">14664</span>&#160;</div><div class="line"><a name="l14665"></a><span class="lineno">14665</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l14666"></a><span class="lineno">14666</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l14667"></a><span class="lineno">14667</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l14668"></a><span class="lineno">14668</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l14669"></a><span class="lineno">14669</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l14670"></a><span class="lineno">14670</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l14671"></a><span class="lineno">14671</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14672"></a><span class="lineno">14672</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l14673"></a><span class="lineno">14673</span>&#160;    {</div><div class="line"><a name="l14674"></a><span class="lineno">14674</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l14675"></a><span class="lineno">14675</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l14676"></a><span class="lineno">14676</span>&#160;</div><div class="line"><a name="l14677"></a><span class="lineno">14677</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l14678"></a><span class="lineno">14678</span>&#160;</div><div class="line"><a name="l14679"></a><span class="lineno">14679</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l14680"></a><span class="lineno">14680</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l14681"></a><span class="lineno">14681</span>&#160;</div><div class="line"><a name="l14682"></a><span class="lineno">14682</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l14683"></a><span class="lineno">14683</span>&#160;</div><div class="line"><a name="l14684"></a><span class="lineno">14684</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l14685"></a><span class="lineno">14685</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l14686"></a><span class="lineno">14686</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l14687"></a><span class="lineno">14687</span>&#160;    }</div><div class="line"><a name="l14688"></a><span class="lineno">14688</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l14689"></a><span class="lineno">14689</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14690"></a><span class="lineno">14690</span>&#160;    {</div><div class="line"><a name="l14691"></a><span class="lineno">14691</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l14692"></a><span class="lineno">14692</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14693"></a><span class="lineno">14693</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14694"></a><span class="lineno">14694</span>&#160;    }</div><div class="line"><a name="l14695"></a><span class="lineno">14695</span>&#160;}</div><div class="line"><a name="l14696"></a><span class="lineno">14696</span>&#160;</div><div class="line"><a name="l14697"></a><span class="lineno">14697</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l14698"></a><span class="lineno">14698</span>&#160;    VkImage hImage,</div><div class="line"><a name="l14699"></a><span class="lineno">14699</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l14700"></a><span class="lineno">14700</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l14701"></a><span class="lineno">14701</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l14702"></a><span class="lineno">14702</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l14703"></a><span class="lineno">14703</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14704"></a><span class="lineno">14704</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l14705"></a><span class="lineno">14705</span>&#160;    {</div><div class="line"><a name="l14706"></a><span class="lineno">14706</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l14707"></a><span class="lineno">14707</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l14708"></a><span class="lineno">14708</span>&#160;</div><div class="line"><a name="l14709"></a><span class="lineno">14709</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l14710"></a><span class="lineno">14710</span>&#160;</div><div class="line"><a name="l14711"></a><span class="lineno">14711</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l14712"></a><span class="lineno">14712</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l14713"></a><span class="lineno">14713</span>&#160;</div><div class="line"><a name="l14714"></a><span class="lineno">14714</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l14715"></a><span class="lineno">14715</span>&#160;</div><div class="line"><a name="l14716"></a><span class="lineno">14716</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l14717"></a><span class="lineno">14717</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l14718"></a><span class="lineno">14718</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l14719"></a><span class="lineno">14719</span>&#160;    }</div><div class="line"><a name="l14720"></a><span class="lineno">14720</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l14721"></a><span class="lineno">14721</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l14722"></a><span class="lineno">14722</span>&#160;    {</div><div class="line"><a name="l14723"></a><span class="lineno">14723</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l14724"></a><span class="lineno">14724</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14725"></a><span class="lineno">14725</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14726"></a><span class="lineno">14726</span>&#160;    }</div><div class="line"><a name="l14727"></a><span class="lineno">14727</span>&#160;}</div><div class="line"><a name="l14728"></a><span class="lineno">14728</span>&#160;</div><div class="line"><a name="l14729"></a><span class="lineno">14729</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l14730"></a><span class="lineno">14730</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l14731"></a><span class="lineno">14731</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l14732"></a><span class="lineno">14732</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l14733"></a><span class="lineno">14733</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l14734"></a><span class="lineno">14734</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l14735"></a><span class="lineno">14735</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="l14736"></a><span class="lineno">14736</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l14737"></a><span class="lineno">14737</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14738"></a><span class="lineno">14738</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div><div class="line"><a name="l14739"></a><span class="lineno">14739</span>&#160;{</div><div class="line"><a name="l14740"></a><span class="lineno">14740</span>&#160;    memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div><div class="line"><a name="l14741"></a><span class="lineno">14741</span>&#160;</div><div class="line"><a name="l14742"></a><span class="lineno">14742</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div><div class="line"><a name="l14743"></a><span class="lineno">14743</span>&#160;</div><div class="line"><a name="l14744"></a><span class="lineno">14744</span>&#160;    <span class="keywordflow">if</span>(vkMemReq.size == 0)</div><div class="line"><a name="l14745"></a><span class="lineno">14745</span>&#160;    {</div><div class="line"><a name="l14746"></a><span class="lineno">14746</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l14747"></a><span class="lineno">14747</span>&#160;    }</div><div class="line"><a name="l14748"></a><span class="lineno">14748</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="l14749"></a><span class="lineno">14749</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="l14750"></a><span class="lineno">14750</span>&#160;    {</div><div class="line"><a name="l14751"></a><span class="lineno">14751</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="l14752"></a><span class="lineno">14752</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14753"></a><span class="lineno">14753</span>&#160;    }</div><div class="line"><a name="l14754"></a><span class="lineno">14754</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="l14755"></a><span class="lineno">14755</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="l14756"></a><span class="lineno">14756</span>&#160;    {</div><div class="line"><a name="l14757"></a><span class="lineno">14757</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="l14758"></a><span class="lineno">14758</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14759"></a><span class="lineno">14759</span>&#160;    }</div><div class="line"><a name="l14760"></a><span class="lineno">14760</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l14761"></a><span class="lineno">14761</span>&#160;    {</div><div class="line"><a name="l14762"></a><span class="lineno">14762</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="l14763"></a><span class="lineno">14763</span>&#160;        {</div><div class="line"><a name="l14764"></a><span class="lineno">14764</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="l14765"></a><span class="lineno">14765</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14766"></a><span class="lineno">14766</span>&#160;        }</div><div class="line"><a name="l14767"></a><span class="lineno">14767</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="l14768"></a><span class="lineno">14768</span>&#160;        {</div><div class="line"><a name="l14769"></a><span class="lineno">14769</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="l14770"></a><span class="lineno">14770</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14771"></a><span class="lineno">14771</span>&#160;        }</div><div class="line"><a name="l14772"></a><span class="lineno">14772</span>&#160;    }</div><div class="line"><a name="l14773"></a><span class="lineno">14773</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="l14774"></a><span class="lineno">14774</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="l14775"></a><span class="lineno">14775</span>&#160;    {</div><div class="line"><a name="l14776"></a><span class="lineno">14776</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="l14777"></a><span class="lineno">14777</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14778"></a><span class="lineno">14778</span>&#160;    }</div><div class="line"><a name="l14779"></a><span class="lineno">14779</span>&#160;</div><div class="line"><a name="l14780"></a><span class="lineno">14780</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="l14781"></a><span class="lineno">14781</span>&#160;    {</div><div class="line"><a name="l14782"></a><span class="lineno">14782</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div><div class="line"><a name="l14783"></a><span class="lineno">14783</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l14784"></a><span class="lineno">14784</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="l14785"></a><span class="lineno">14785</span>&#160;</div><div class="line"><a name="l14786"></a><span class="lineno">14786</span>&#160;        <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div><div class="line"><a name="l14787"></a><span class="lineno">14787</span>&#160;        <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l14788"></a><span class="lineno">14788</span>&#160;        <span class="keywordflow">if</span>((createInfoForPool.<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="l14789"></a><span class="lineno">14789</span>&#160;            (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l14790"></a><span class="lineno">14790</span>&#160;        {</div><div class="line"><a name="l14791"></a><span class="lineno">14791</span>&#160;            createInfoForPool.<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="l14792"></a><span class="lineno">14792</span>&#160;        }</div><div class="line"><a name="l14793"></a><span class="lineno">14793</span>&#160;</div><div class="line"><a name="l14794"></a><span class="lineno">14794</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="l14795"></a><span class="lineno">14795</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l14796"></a><span class="lineno">14796</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l14797"></a><span class="lineno">14797</span>&#160;            alignmentForPool,</div><div class="line"><a name="l14798"></a><span class="lineno">14798</span>&#160;            createInfoForPool,</div><div class="line"><a name="l14799"></a><span class="lineno">14799</span>&#160;            suballocType,</div><div class="line"><a name="l14800"></a><span class="lineno">14800</span>&#160;            allocationCount,</div><div class="line"><a name="l14801"></a><span class="lineno">14801</span>&#160;            pAllocations);</div><div class="line"><a name="l14802"></a><span class="lineno">14802</span>&#160;    }</div><div class="line"><a name="l14803"></a><span class="lineno">14803</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l14804"></a><span class="lineno">14804</span>&#160;    {</div><div class="line"><a name="l14805"></a><span class="lineno">14805</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l14806"></a><span class="lineno">14806</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l14807"></a><span class="lineno">14807</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l14808"></a><span class="lineno">14808</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="l14809"></a><span class="lineno">14809</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l14810"></a><span class="lineno">14810</span>&#160;        {</div><div class="line"><a name="l14811"></a><span class="lineno">14811</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l14812"></a><span class="lineno">14812</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l14813"></a><span class="lineno">14813</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l14814"></a><span class="lineno">14814</span>&#160;</div><div class="line"><a name="l14815"></a><span class="lineno">14815</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l14816"></a><span class="lineno">14816</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l14817"></a><span class="lineno">14817</span>&#160;                alignmentForMemType,</div><div class="line"><a name="l14818"></a><span class="lineno">14818</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l14819"></a><span class="lineno">14819</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l14820"></a><span class="lineno">14820</span>&#160;                dedicatedImage,</div><div class="line"><a name="l14821"></a><span class="lineno">14821</span>&#160;                createInfo,</div><div class="line"><a name="l14822"></a><span class="lineno">14822</span>&#160;                memTypeIndex,</div><div class="line"><a name="l14823"></a><span class="lineno">14823</span>&#160;                suballocType,</div><div class="line"><a name="l14824"></a><span class="lineno">14824</span>&#160;                allocationCount,</div><div class="line"><a name="l14825"></a><span class="lineno">14825</span>&#160;                pAllocations);</div><div class="line"><a name="l14826"></a><span class="lineno">14826</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l14827"></a><span class="lineno">14827</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l14828"></a><span class="lineno">14828</span>&#160;            {</div><div class="line"><a name="l14829"></a><span class="lineno">14829</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14830"></a><span class="lineno">14830</span>&#160;            }</div><div class="line"><a name="l14831"></a><span class="lineno">14831</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l14832"></a><span class="lineno">14832</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l14833"></a><span class="lineno">14833</span>&#160;            {</div><div class="line"><a name="l14834"></a><span class="lineno">14834</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l14835"></a><span class="lineno">14835</span>&#160;                {</div><div class="line"><a name="l14836"></a><span class="lineno">14836</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l14837"></a><span class="lineno">14837</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l14838"></a><span class="lineno">14838</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l14839"></a><span class="lineno">14839</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="l14840"></a><span class="lineno">14840</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l14841"></a><span class="lineno">14841</span>&#160;                    {</div><div class="line"><a name="l14842"></a><span class="lineno">14842</span>&#160;                        alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l14843"></a><span class="lineno">14843</span>&#160;                            vkMemReq.alignment,</div><div class="line"><a name="l14844"></a><span class="lineno">14844</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l14845"></a><span class="lineno">14845</span>&#160;                        </div><div class="line"><a name="l14846"></a><span class="lineno">14846</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l14847"></a><span class="lineno">14847</span>&#160;                            vkMemReq.size,</div><div class="line"><a name="l14848"></a><span class="lineno">14848</span>&#160;                            alignmentForMemType,</div><div class="line"><a name="l14849"></a><span class="lineno">14849</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l14850"></a><span class="lineno">14850</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l14851"></a><span class="lineno">14851</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l14852"></a><span class="lineno">14852</span>&#160;                            createInfo,</div><div class="line"><a name="l14853"></a><span class="lineno">14853</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l14854"></a><span class="lineno">14854</span>&#160;                            suballocType,</div><div class="line"><a name="l14855"></a><span class="lineno">14855</span>&#160;                            allocationCount,</div><div class="line"><a name="l14856"></a><span class="lineno">14856</span>&#160;                            pAllocations);</div><div class="line"><a name="l14857"></a><span class="lineno">14857</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l14858"></a><span class="lineno">14858</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l14859"></a><span class="lineno">14859</span>&#160;                        {</div><div class="line"><a name="l14860"></a><span class="lineno">14860</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14861"></a><span class="lineno">14861</span>&#160;                        }</div><div class="line"><a name="l14862"></a><span class="lineno">14862</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="l14863"></a><span class="lineno">14863</span>&#160;                    }</div><div class="line"><a name="l14864"></a><span class="lineno">14864</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l14865"></a><span class="lineno">14865</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l14866"></a><span class="lineno">14866</span>&#160;                    {</div><div class="line"><a name="l14867"></a><span class="lineno">14867</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="l14868"></a><span class="lineno">14868</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l14869"></a><span class="lineno">14869</span>&#160;                    }</div><div class="line"><a name="l14870"></a><span class="lineno">14870</span>&#160;                }</div><div class="line"><a name="l14871"></a><span class="lineno">14871</span>&#160;            }</div><div class="line"><a name="l14872"></a><span class="lineno">14872</span>&#160;        }</div><div class="line"><a name="l14873"></a><span class="lineno">14873</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="l14874"></a><span class="lineno">14874</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l14875"></a><span class="lineno">14875</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14876"></a><span class="lineno">14876</span>&#160;    }</div><div class="line"><a name="l14877"></a><span class="lineno">14877</span>&#160;}</div><div class="line"><a name="l14878"></a><span class="lineno">14878</span>&#160;</div><div class="line"><a name="l14879"></a><span class="lineno">14879</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div><div class="line"><a name="l14880"></a><span class="lineno">14880</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14881"></a><span class="lineno">14881</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div><div class="line"><a name="l14882"></a><span class="lineno">14882</span>&#160;{</div><div class="line"><a name="l14883"></a><span class="lineno">14883</span>&#160;    VMA_ASSERT(pAllocations);</div><div class="line"><a name="l14884"></a><span class="lineno">14884</span>&#160;</div><div class="line"><a name="l14885"></a><span class="lineno">14885</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div><div class="line"><a name="l14886"></a><span class="lineno">14886</span>&#160;    {</div><div class="line"><a name="l14887"></a><span class="lineno">14887</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div><div class="line"><a name="l14888"></a><span class="lineno">14888</span>&#160;</div><div class="line"><a name="l14889"></a><span class="lineno">14889</span>&#160;        <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l14890"></a><span class="lineno">14890</span>&#160;        {</div><div class="line"><a name="l14891"></a><span class="lineno">14891</span>&#160;            <span class="keywordflow">if</span>(TouchAllocation(allocation))</div><div class="line"><a name="l14892"></a><span class="lineno">14892</span>&#160;            {</div><div class="line"><a name="l14893"></a><span class="lineno">14893</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l14894"></a><span class="lineno">14894</span>&#160;                {</div><div class="line"><a name="l14895"></a><span class="lineno">14895</span>&#160;                    FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div><div class="line"><a name="l14896"></a><span class="lineno">14896</span>&#160;                }</div><div class="line"><a name="l14897"></a><span class="lineno">14897</span>&#160;</div><div class="line"><a name="l14898"></a><span class="lineno">14898</span>&#160;                <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l14899"></a><span class="lineno">14899</span>&#160;                {</div><div class="line"><a name="l14900"></a><span class="lineno">14900</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l14901"></a><span class="lineno">14901</span>&#160;                    {</div><div class="line"><a name="l14902"></a><span class="lineno">14902</span>&#160;                        VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l14903"></a><span class="lineno">14903</span>&#160;                        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetBlock()-&gt;GetParentPool();</div><div class="line"><a name="l14904"></a><span class="lineno">14904</span>&#160;                        <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l14905"></a><span class="lineno">14905</span>&#160;                        {</div><div class="line"><a name="l14906"></a><span class="lineno">14906</span>&#160;                            pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l14907"></a><span class="lineno">14907</span>&#160;                        }</div><div class="line"><a name="l14908"></a><span class="lineno">14908</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l14909"></a><span class="lineno">14909</span>&#160;                        {</div><div class="line"><a name="l14910"></a><span class="lineno">14910</span>&#160;                            <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l14911"></a><span class="lineno">14911</span>&#160;                            pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l14912"></a><span class="lineno">14912</span>&#160;                        }</div><div class="line"><a name="l14913"></a><span class="lineno">14913</span>&#160;                        pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l14914"></a><span class="lineno">14914</span>&#160;                    }</div><div class="line"><a name="l14915"></a><span class="lineno">14915</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l14916"></a><span class="lineno">14916</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l14917"></a><span class="lineno">14917</span>&#160;                    FreeDedicatedMemory(allocation);</div><div class="line"><a name="l14918"></a><span class="lineno">14918</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l14919"></a><span class="lineno">14919</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l14920"></a><span class="lineno">14920</span>&#160;                    VMA_ASSERT(0);</div><div class="line"><a name="l14921"></a><span class="lineno">14921</span>&#160;                }</div><div class="line"><a name="l14922"></a><span class="lineno">14922</span>&#160;            }</div><div class="line"><a name="l14923"></a><span class="lineno">14923</span>&#160;</div><div class="line"><a name="l14924"></a><span class="lineno">14924</span>&#160;            allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l14925"></a><span class="lineno">14925</span>&#160;            allocation-&gt;Dtor();</div><div class="line"><a name="l14926"></a><span class="lineno">14926</span>&#160;            m_AllocationObjectAllocator.Free(allocation);</div><div class="line"><a name="l14927"></a><span class="lineno">14927</span>&#160;        }</div><div class="line"><a name="l14928"></a><span class="lineno">14928</span>&#160;    }</div><div class="line"><a name="l14929"></a><span class="lineno">14929</span>&#160;}</div><div class="line"><a name="l14930"></a><span class="lineno">14930</span>&#160;</div><div class="line"><a name="l14931"></a><span class="lineno">14931</span>&#160;VkResult VmaAllocator_T::ResizeAllocation(</div><div class="line"><a name="l14932"></a><span class="lineno">14932</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div><div class="line"><a name="l14933"></a><span class="lineno">14933</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l14934"></a><span class="lineno">14934</span>&#160;{</div><div class="line"><a name="l14935"></a><span class="lineno">14935</span>&#160;    <span class="comment">// This function is deprecated and so it does nothing. It&#39;s left for backward compatibility.</span></div><div class="line"><a name="l14936"></a><span class="lineno">14936</span>&#160;    <span class="keywordflow">if</span>(newSize == 0 || alloc-&gt;GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l14937"></a><span class="lineno">14937</span>&#160;    {</div><div class="line"><a name="l14938"></a><span class="lineno">14938</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l14939"></a><span class="lineno">14939</span>&#160;    }</div><div class="line"><a name="l14940"></a><span class="lineno">14940</span>&#160;    <span class="keywordflow">if</span>(newSize == alloc-&gt;GetSize())</div><div class="line"><a name="l14941"></a><span class="lineno">14941</span>&#160;    {</div><div class="line"><a name="l14942"></a><span class="lineno">14942</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14943"></a><span class="lineno">14943</span>&#160;    }</div><div class="line"><a name="l14944"></a><span class="lineno">14944</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div><div class="line"><a name="l14945"></a><span class="lineno">14945</span>&#160;}</div><div class="line"><a name="l14946"></a><span class="lineno">14946</span>&#160;</div><div class="line"><a name="l14947"></a><span class="lineno">14947</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="l14948"></a><span class="lineno">14948</span>&#160;{</div><div class="line"><a name="l14949"></a><span class="lineno">14949</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l14950"></a><span class="lineno">14950</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l14951"></a><span class="lineno">14951</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="l14952"></a><span class="lineno">14952</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l14953"></a><span class="lineno">14953</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="l14954"></a><span class="lineno">14954</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l14955"></a><span class="lineno">14955</span>&#160;    </div><div class="line"><a name="l14956"></a><span class="lineno">14956</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l14957"></a><span class="lineno">14957</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l14958"></a><span class="lineno">14958</span>&#160;    {</div><div class="line"><a name="l14959"></a><span class="lineno">14959</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l14960"></a><span class="lineno">14960</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l14961"></a><span class="lineno">14961</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l14962"></a><span class="lineno">14962</span>&#160;    }</div><div class="line"><a name="l14963"></a><span class="lineno">14963</span>&#160;</div><div class="line"><a name="l14964"></a><span class="lineno">14964</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l14965"></a><span class="lineno">14965</span>&#160;    {</div><div class="line"><a name="l14966"></a><span class="lineno">14966</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l14967"></a><span class="lineno">14967</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="l14968"></a><span class="lineno">14968</span>&#160;        {</div><div class="line"><a name="l14969"></a><span class="lineno">14969</span>&#160;            m_Pools[poolIndex]-&gt;m_BlockVector.AddStats(pStats);</div><div class="line"><a name="l14970"></a><span class="lineno">14970</span>&#160;        }</div><div class="line"><a name="l14971"></a><span class="lineno">14971</span>&#160;    }</div><div class="line"><a name="l14972"></a><span class="lineno">14972</span>&#160;</div><div class="line"><a name="l14973"></a><span class="lineno">14973</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l14974"></a><span class="lineno">14974</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l14975"></a><span class="lineno">14975</span>&#160;    {</div><div class="line"><a name="l14976"></a><span class="lineno">14976</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l14977"></a><span class="lineno">14977</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l14978"></a><span class="lineno">14978</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l14979"></a><span class="lineno">14979</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l14980"></a><span class="lineno">14980</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="l14981"></a><span class="lineno">14981</span>&#160;        {</div><div class="line"><a name="l14982"></a><span class="lineno">14982</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l14983"></a><span class="lineno">14983</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l14984"></a><span class="lineno">14984</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l14985"></a><span class="lineno">14985</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l14986"></a><span class="lineno">14986</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l14987"></a><span class="lineno">14987</span>&#160;        }</div><div class="line"><a name="l14988"></a><span class="lineno">14988</span>&#160;    }</div><div class="line"><a name="l14989"></a><span class="lineno">14989</span>&#160;</div><div class="line"><a name="l14990"></a><span class="lineno">14990</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l14991"></a><span class="lineno">14991</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l14992"></a><span class="lineno">14992</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="l14993"></a><span class="lineno">14993</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l14994"></a><span class="lineno">14994</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="l14995"></a><span class="lineno">14995</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l14996"></a><span class="lineno">14996</span>&#160;}</div><div class="line"><a name="l14997"></a><span class="lineno">14997</span>&#160;</div><div class="line"><a name="l14998"></a><span class="lineno">14998</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="l14999"></a><span class="lineno">14999</span>&#160;</div><div class="line"><a name="l15000"></a><span class="lineno">15000</span>&#160;VkResult VmaAllocator_T::DefragmentationBegin(</div><div class="line"><a name="l15001"></a><span class="lineno">15001</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="l15002"></a><span class="lineno">15002</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l15003"></a><span class="lineno">15003</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div><div class="line"><a name="l15004"></a><span class="lineno">15004</span>&#160;{</div><div class="line"><a name="l15005"></a><span class="lineno">15005</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="l15006"></a><span class="lineno">15006</span>&#160;    {</div><div class="line"><a name="l15007"></a><span class="lineno">15007</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#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> * <span class="keyword">sizeof</span>(VkBool32));</div><div class="line"><a name="l15008"></a><span class="lineno">15008</span>&#160;    }</div><div class="line"><a name="l15009"></a><span class="lineno">15009</span>&#160;</div><div class="line"><a name="l15010"></a><span class="lineno">15010</span>&#160;    *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div><div class="line"><a name="l15011"></a><span class="lineno">15011</span>&#160;        <span class="keyword">this</span>, m_CurrentFrameIndex.load(), info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>, pStats);</div><div class="line"><a name="l15012"></a><span class="lineno">15012</span>&#160;</div><div class="line"><a name="l15013"></a><span class="lineno">15013</span>&#160;    (*pContext)-&gt;AddPools(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>);</div><div class="line"><a name="l15014"></a><span class="lineno">15014</span>&#160;    (*pContext)-&gt;AddAllocations(</div><div class="line"><a name="l15015"></a><span class="lineno">15015</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>);</div><div class="line"><a name="l15016"></a><span class="lineno">15016</span>&#160;</div><div class="line"><a name="l15017"></a><span class="lineno">15017</span>&#160;    VkResult res = (*pContext)-&gt;Defragment(</div><div class="line"><a name="l15018"></a><span class="lineno">15018</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div><div class="line"><a name="l15019"></a><span class="lineno">15019</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div><div class="line"><a name="l15020"></a><span class="lineno">15020</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats);</div><div class="line"><a name="l15021"></a><span class="lineno">15021</span>&#160;</div><div class="line"><a name="l15022"></a><span class="lineno">15022</span>&#160;    <span class="keywordflow">if</span>(res != VK_NOT_READY)</div><div class="line"><a name="l15023"></a><span class="lineno">15023</span>&#160;    {</div><div class="line"><a name="l15024"></a><span class="lineno">15024</span>&#160;        vma_delete(<span class="keyword">this</span>, *pContext);</div><div class="line"><a name="l15025"></a><span class="lineno">15025</span>&#160;        *pContext = VMA_NULL;</div><div class="line"><a name="l15026"></a><span class="lineno">15026</span>&#160;    }</div><div class="line"><a name="l15027"></a><span class="lineno">15027</span>&#160;</div><div class="line"><a name="l15028"></a><span class="lineno">15028</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15029"></a><span class="lineno">15029</span>&#160;}</div><div class="line"><a name="l15030"></a><span class="lineno">15030</span>&#160;</div><div class="line"><a name="l15031"></a><span class="lineno">15031</span>&#160;VkResult VmaAllocator_T::DefragmentationEnd(</div><div class="line"><a name="l15032"></a><span class="lineno">15032</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div><div class="line"><a name="l15033"></a><span class="lineno">15033</span>&#160;{</div><div class="line"><a name="l15034"></a><span class="lineno">15034</span>&#160;    vma_delete(<span class="keyword">this</span>, context);</div><div class="line"><a name="l15035"></a><span class="lineno">15035</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l15036"></a><span class="lineno">15036</span>&#160;}</div><div class="line"><a name="l15037"></a><span class="lineno">15037</span>&#160;</div><div class="line"><a name="l15038"></a><span class="lineno">15038</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="l15039"></a><span class="lineno">15039</span>&#160;{</div><div class="line"><a name="l15040"></a><span class="lineno">15040</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l15041"></a><span class="lineno">15041</span>&#160;    {</div><div class="line"><a name="l15042"></a><span class="lineno">15042</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l15043"></a><span class="lineno">15043</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l15044"></a><span class="lineno">15044</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l15045"></a><span class="lineno">15045</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l15046"></a><span class="lineno">15046</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l15047"></a><span class="lineno">15047</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l15048"></a><span class="lineno">15048</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l15049"></a><span class="lineno">15049</span>&#160;        {</div><div class="line"><a name="l15050"></a><span class="lineno">15050</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l15051"></a><span class="lineno">15051</span>&#160;            {</div><div class="line"><a name="l15052"></a><span class="lineno">15052</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l15053"></a><span class="lineno">15053</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="l15054"></a><span class="lineno">15054</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l15055"></a><span class="lineno">15055</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="l15056"></a><span class="lineno">15056</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l15057"></a><span class="lineno">15057</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="l15058"></a><span class="lineno">15058</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l15059"></a><span class="lineno">15059</span>&#160;            }</div><div class="line"><a name="l15060"></a><span class="lineno">15060</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l15061"></a><span class="lineno">15061</span>&#160;            {</div><div class="line"><a name="l15062"></a><span class="lineno">15062</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="l15063"></a><span class="lineno">15063</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="l15064"></a><span class="lineno">15064</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="l15065"></a><span class="lineno">15065</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="l15066"></a><span class="lineno">15066</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l15067"></a><span class="lineno">15067</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="l15068"></a><span class="lineno">15068</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l15069"></a><span class="lineno">15069</span>&#160;            }</div><div class="line"><a name="l15070"></a><span class="lineno">15070</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l15071"></a><span class="lineno">15071</span>&#160;            {</div><div class="line"><a name="l15072"></a><span class="lineno">15072</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l15073"></a><span class="lineno">15073</span>&#160;                {</div><div class="line"><a name="l15074"></a><span class="lineno">15074</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l15075"></a><span class="lineno">15075</span>&#160;                }</div><div class="line"><a name="l15076"></a><span class="lineno">15076</span>&#160;            }</div><div class="line"><a name="l15077"></a><span class="lineno">15077</span>&#160;        }</div><div class="line"><a name="l15078"></a><span class="lineno">15078</span>&#160;    }</div><div class="line"><a name="l15079"></a><span class="lineno">15079</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l15080"></a><span class="lineno">15080</span>&#160;    {</div><div class="line"><a name="l15081"></a><span class="lineno">15081</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15082"></a><span class="lineno">15082</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l15083"></a><span class="lineno">15083</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l15084"></a><span class="lineno">15084</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l15085"></a><span class="lineno">15085</span>&#160;        {</div><div class="line"><a name="l15086"></a><span class="lineno">15086</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l15087"></a><span class="lineno">15087</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l15088"></a><span class="lineno">15088</span>&#160;            {</div><div class="line"><a name="l15089"></a><span class="lineno">15089</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l15090"></a><span class="lineno">15090</span>&#160;            }</div><div class="line"><a name="l15091"></a><span class="lineno">15091</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l15092"></a><span class="lineno">15092</span>&#160;            {</div><div class="line"><a name="l15093"></a><span class="lineno">15093</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l15094"></a><span class="lineno">15094</span>&#160;                {</div><div class="line"><a name="l15095"></a><span class="lineno">15095</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l15096"></a><span class="lineno">15096</span>&#160;                }</div><div class="line"><a name="l15097"></a><span class="lineno">15097</span>&#160;            }</div><div class="line"><a name="l15098"></a><span class="lineno">15098</span>&#160;        }</div><div class="line"><a name="l15099"></a><span class="lineno">15099</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l15100"></a><span class="lineno">15100</span>&#160;</div><div class="line"><a name="l15101"></a><span class="lineno">15101</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="l15102"></a><span class="lineno">15102</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="l15103"></a><span class="lineno">15103</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="l15104"></a><span class="lineno">15104</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="l15105"></a><span class="lineno">15105</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="l15106"></a><span class="lineno">15106</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="l15107"></a><span class="lineno">15107</span>&#160;    }</div><div class="line"><a name="l15108"></a><span class="lineno">15108</span>&#160;}</div><div class="line"><a name="l15109"></a><span class="lineno">15109</span>&#160;</div><div class="line"><a name="l15110"></a><span class="lineno">15110</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="l15111"></a><span class="lineno">15111</span>&#160;{</div><div class="line"><a name="l15112"></a><span class="lineno">15112</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l15113"></a><span class="lineno">15113</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l15114"></a><span class="lineno">15114</span>&#160;    {</div><div class="line"><a name="l15115"></a><span class="lineno">15115</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l15116"></a><span class="lineno">15116</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l15117"></a><span class="lineno">15117</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l15118"></a><span class="lineno">15118</span>&#160;        {</div><div class="line"><a name="l15119"></a><span class="lineno">15119</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l15120"></a><span class="lineno">15120</span>&#160;            {</div><div class="line"><a name="l15121"></a><span class="lineno">15121</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l15122"></a><span class="lineno">15122</span>&#160;            }</div><div class="line"><a name="l15123"></a><span class="lineno">15123</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l15124"></a><span class="lineno">15124</span>&#160;            {</div><div class="line"><a name="l15125"></a><span class="lineno">15125</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l15126"></a><span class="lineno">15126</span>&#160;            }</div><div class="line"><a name="l15127"></a><span class="lineno">15127</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l15128"></a><span class="lineno">15128</span>&#160;            {</div><div class="line"><a name="l15129"></a><span class="lineno">15129</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l15130"></a><span class="lineno">15130</span>&#160;                {</div><div class="line"><a name="l15131"></a><span class="lineno">15131</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l15132"></a><span class="lineno">15132</span>&#160;                }</div><div class="line"><a name="l15133"></a><span class="lineno">15133</span>&#160;            }</div><div class="line"><a name="l15134"></a><span class="lineno">15134</span>&#160;        }</div><div class="line"><a name="l15135"></a><span class="lineno">15135</span>&#160;    }</div><div class="line"><a name="l15136"></a><span class="lineno">15136</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l15137"></a><span class="lineno">15137</span>&#160;    {</div><div class="line"><a name="l15138"></a><span class="lineno">15138</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15139"></a><span class="lineno">15139</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l15140"></a><span class="lineno">15140</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l15141"></a><span class="lineno">15141</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l15142"></a><span class="lineno">15142</span>&#160;        {</div><div class="line"><a name="l15143"></a><span class="lineno">15143</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l15144"></a><span class="lineno">15144</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l15145"></a><span class="lineno">15145</span>&#160;            {</div><div class="line"><a name="l15146"></a><span class="lineno">15146</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l15147"></a><span class="lineno">15147</span>&#160;            }</div><div class="line"><a name="l15148"></a><span class="lineno">15148</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l15149"></a><span class="lineno">15149</span>&#160;            {</div><div class="line"><a name="l15150"></a><span class="lineno">15150</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l15151"></a><span class="lineno">15151</span>&#160;                {</div><div class="line"><a name="l15152"></a><span class="lineno">15152</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l15153"></a><span class="lineno">15153</span>&#160;                }</div><div class="line"><a name="l15154"></a><span class="lineno">15154</span>&#160;            }</div><div class="line"><a name="l15155"></a><span class="lineno">15155</span>&#160;        }</div><div class="line"><a name="l15156"></a><span class="lineno">15156</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l15157"></a><span class="lineno">15157</span>&#160;</div><div class="line"><a name="l15158"></a><span class="lineno">15158</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l15159"></a><span class="lineno">15159</span>&#160;    }</div><div class="line"><a name="l15160"></a><span class="lineno">15160</span>&#160;}</div><div class="line"><a name="l15161"></a><span class="lineno">15161</span>&#160;</div><div class="line"><a name="l15162"></a><span class="lineno">15162</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="l15163"></a><span class="lineno">15163</span>&#160;{</div><div class="line"><a name="l15164"></a><span class="lineno">15164</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="l15165"></a><span class="lineno">15165</span>&#160;</div><div class="line"><a name="l15166"></a><span class="lineno">15166</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l15167"></a><span class="lineno">15167</span>&#160;</div><div class="line"><a name="l15168"></a><span class="lineno">15168</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="l15169"></a><span class="lineno">15169</span>&#160;    {</div><div class="line"><a name="l15170"></a><span class="lineno">15170</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l15171"></a><span class="lineno">15171</span>&#160;    }</div><div class="line"><a name="l15172"></a><span class="lineno">15172</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="l15173"></a><span class="lineno">15173</span>&#160;    {</div><div class="line"><a name="l15174"></a><span class="lineno">15174</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l15175"></a><span class="lineno">15175</span>&#160;    }</div><div class="line"><a name="l15176"></a><span class="lineno">15176</span>&#160;</div><div class="line"><a name="l15177"></a><span class="lineno">15177</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="l15178"></a><span class="lineno">15178</span>&#160;</div><div class="line"><a name="l15179"></a><span class="lineno">15179</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="l15180"></a><span class="lineno">15180</span>&#160;</div><div class="line"><a name="l15181"></a><span class="lineno">15181</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l15182"></a><span class="lineno">15182</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l15183"></a><span class="lineno">15183</span>&#160;    {</div><div class="line"><a name="l15184"></a><span class="lineno">15184</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l15185"></a><span class="lineno">15185</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l15186"></a><span class="lineno">15186</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15187"></a><span class="lineno">15187</span>&#160;    }</div><div class="line"><a name="l15188"></a><span class="lineno">15188</span>&#160;</div><div class="line"><a name="l15189"></a><span class="lineno">15189</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l15190"></a><span class="lineno">15190</span>&#160;    {</div><div class="line"><a name="l15191"></a><span class="lineno">15191</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l15192"></a><span class="lineno">15192</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div><div class="line"><a name="l15193"></a><span class="lineno">15193</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l15194"></a><span class="lineno">15194</span>&#160;    }</div><div class="line"><a name="l15195"></a><span class="lineno">15195</span>&#160;</div><div class="line"><a name="l15196"></a><span class="lineno">15196</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l15197"></a><span class="lineno">15197</span>&#160;}</div><div class="line"><a name="l15198"></a><span class="lineno">15198</span>&#160;</div><div class="line"><a name="l15199"></a><span class="lineno">15199</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="l15200"></a><span class="lineno">15200</span>&#160;{</div><div class="line"><a name="l15201"></a><span class="lineno">15201</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l15202"></a><span class="lineno">15202</span>&#160;    {</div><div class="line"><a name="l15203"></a><span class="lineno">15203</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l15204"></a><span class="lineno">15204</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l15205"></a><span class="lineno">15205</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l15206"></a><span class="lineno">15206</span>&#160;    }</div><div class="line"><a name="l15207"></a><span class="lineno">15207</span>&#160;</div><div class="line"><a name="l15208"></a><span class="lineno">15208</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l15209"></a><span class="lineno">15209</span>&#160;}</div><div class="line"><a name="l15210"></a><span class="lineno">15210</span>&#160;</div><div class="line"><a name="l15211"></a><span class="lineno">15211</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="l15212"></a><span class="lineno">15212</span>&#160;{</div><div class="line"><a name="l15213"></a><span class="lineno">15213</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l15214"></a><span class="lineno">15214</span>&#160;}</div><div class="line"><a name="l15215"></a><span class="lineno">15215</span>&#160;</div><div class="line"><a name="l15216"></a><span class="lineno">15216</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l15217"></a><span class="lineno">15217</span>&#160;{</div><div class="line"><a name="l15218"></a><span class="lineno">15218</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l15219"></a><span class="lineno">15219</span>&#160;}</div><div class="line"><a name="l15220"></a><span class="lineno">15220</span>&#160;</div><div class="line"><a name="l15221"></a><span class="lineno">15221</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l15222"></a><span class="lineno">15222</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l15223"></a><span class="lineno">15223</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l15224"></a><span class="lineno">15224</span>&#160;{</div><div class="line"><a name="l15225"></a><span class="lineno">15225</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l15226"></a><span class="lineno">15226</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l15227"></a><span class="lineno">15227</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l15228"></a><span class="lineno">15228</span>&#160;}</div><div class="line"><a name="l15229"></a><span class="lineno">15229</span>&#160;</div><div class="line"><a name="l15230"></a><span class="lineno">15230</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div><div class="line"><a name="l15231"></a><span class="lineno">15231</span>&#160;{</div><div class="line"><a name="l15232"></a><span class="lineno">15232</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l15233"></a><span class="lineno">15233</span>&#160;}</div><div class="line"><a name="l15234"></a><span class="lineno">15234</span>&#160;</div><div class="line"><a name="l15235"></a><span class="lineno">15235</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div><div class="line"><a name="l15236"></a><span class="lineno">15236</span>&#160;{</div><div class="line"><a name="l15237"></a><span class="lineno">15237</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l15238"></a><span class="lineno">15238</span>&#160;</div><div class="line"><a name="l15239"></a><span class="lineno">15239</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l15240"></a><span class="lineno">15240</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l15241"></a><span class="lineno">15241</span>&#160;    {</div><div class="line"><a name="l15242"></a><span class="lineno">15242</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l15243"></a><span class="lineno">15243</span>&#160;        {</div><div class="line"><a name="l15244"></a><span class="lineno">15244</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l15245"></a><span class="lineno">15245</span>&#160;            VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l15246"></a><span class="lineno">15246</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div><div class="line"><a name="l15247"></a><span class="lineno">15247</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l15248"></a><span class="lineno">15248</span>&#160;            {</div><div class="line"><a name="l15249"></a><span class="lineno">15249</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l15250"></a><span class="lineno">15250</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l15251"></a><span class="lineno">15251</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l15252"></a><span class="lineno">15252</span>&#160;                finalRes = VK_SUCCESS;</div><div class="line"><a name="l15253"></a><span class="lineno">15253</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l15254"></a><span class="lineno">15254</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l15255"></a><span class="lineno">15255</span>&#160;                <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l15256"></a><span class="lineno">15256</span>&#160;            }</div><div class="line"><a name="l15257"></a><span class="lineno">15257</span>&#160;        }</div><div class="line"><a name="l15258"></a><span class="lineno">15258</span>&#160;    }</div><div class="line"><a name="l15259"></a><span class="lineno">15259</span>&#160;</div><div class="line"><a name="l15260"></a><span class="lineno">15260</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l15261"></a><span class="lineno">15261</span>&#160;    {</div><div class="line"><a name="l15262"></a><span class="lineno">15262</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l15263"></a><span class="lineno">15263</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="l15264"></a><span class="lineno">15264</span>&#160;        {</div><div class="line"><a name="l15265"></a><span class="lineno">15265</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="l15266"></a><span class="lineno">15266</span>&#160;            {</div><div class="line"><a name="l15267"></a><span class="lineno">15267</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l15268"></a><span class="lineno">15268</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l15269"></a><span class="lineno">15269</span>&#160;                {</div><div class="line"><a name="l15270"></a><span class="lineno">15270</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l15271"></a><span class="lineno">15271</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l15272"></a><span class="lineno">15272</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l15273"></a><span class="lineno">15273</span>&#160;                    finalRes = VK_SUCCESS;</div><div class="line"><a name="l15274"></a><span class="lineno">15274</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l15275"></a><span class="lineno">15275</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l15276"></a><span class="lineno">15276</span>&#160;                    <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l15277"></a><span class="lineno">15277</span>&#160;                }</div><div class="line"><a name="l15278"></a><span class="lineno">15278</span>&#160;            }</div><div class="line"><a name="l15279"></a><span class="lineno">15279</span>&#160;        }</div><div class="line"><a name="l15280"></a><span class="lineno">15280</span>&#160;    }</div><div class="line"><a name="l15281"></a><span class="lineno">15281</span>&#160;</div><div class="line"><a name="l15282"></a><span class="lineno">15282</span>&#160;    <span class="keywordflow">return</span> finalRes;</div><div class="line"><a name="l15283"></a><span class="lineno">15283</span>&#160;}</div><div class="line"><a name="l15284"></a><span class="lineno">15284</span>&#160;</div><div class="line"><a name="l15285"></a><span class="lineno">15285</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="l15286"></a><span class="lineno">15286</span>&#160;{</div><div class="line"><a name="l15287"></a><span class="lineno">15287</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate();</div><div class="line"><a name="l15288"></a><span class="lineno">15288</span>&#160;    (*pAllocation)-&gt;Ctor(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div><div class="line"><a name="l15289"></a><span class="lineno">15289</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l15290"></a><span class="lineno">15290</span>&#160;}</div><div class="line"><a name="l15291"></a><span class="lineno">15291</span>&#160;</div><div class="line"><a name="l15292"></a><span class="lineno">15292</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l15293"></a><span class="lineno">15293</span>&#160;{</div><div class="line"><a name="l15294"></a><span class="lineno">15294</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l15295"></a><span class="lineno">15295</span>&#160;</div><div class="line"><a name="l15296"></a><span class="lineno">15296</span>&#160;    VkResult res;</div><div class="line"><a name="l15297"></a><span class="lineno">15297</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l15298"></a><span class="lineno">15298</span>&#160;    {</div><div class="line"><a name="l15299"></a><span class="lineno">15299</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l15300"></a><span class="lineno">15300</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l15301"></a><span class="lineno">15301</span>&#160;        {</div><div class="line"><a name="l15302"></a><span class="lineno">15302</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l15303"></a><span class="lineno">15303</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l15304"></a><span class="lineno">15304</span>&#160;            {</div><div class="line"><a name="l15305"></a><span class="lineno">15305</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l15306"></a><span class="lineno">15306</span>&#160;            }</div><div class="line"><a name="l15307"></a><span class="lineno">15307</span>&#160;        }</div><div class="line"><a name="l15308"></a><span class="lineno">15308</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l15309"></a><span class="lineno">15309</span>&#160;        {</div><div class="line"><a name="l15310"></a><span class="lineno">15310</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l15311"></a><span class="lineno">15311</span>&#160;        }</div><div class="line"><a name="l15312"></a><span class="lineno">15312</span>&#160;    }</div><div class="line"><a name="l15313"></a><span class="lineno">15313</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l15314"></a><span class="lineno">15314</span>&#160;    {</div><div class="line"><a name="l15315"></a><span class="lineno">15315</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l15316"></a><span class="lineno">15316</span>&#160;    }</div><div class="line"><a name="l15317"></a><span class="lineno">15317</span>&#160;</div><div class="line"><a name="l15318"></a><span class="lineno">15318</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="l15319"></a><span class="lineno">15319</span>&#160;    {</div><div class="line"><a name="l15320"></a><span class="lineno">15320</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="l15321"></a><span class="lineno">15321</span>&#160;    }</div><div class="line"><a name="l15322"></a><span class="lineno">15322</span>&#160;</div><div class="line"><a name="l15323"></a><span class="lineno">15323</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15324"></a><span class="lineno">15324</span>&#160;}</div><div class="line"><a name="l15325"></a><span class="lineno">15325</span>&#160;</div><div class="line"><a name="l15326"></a><span class="lineno">15326</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l15327"></a><span class="lineno">15327</span>&#160;{</div><div class="line"><a name="l15328"></a><span class="lineno">15328</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="l15329"></a><span class="lineno">15329</span>&#160;    {</div><div class="line"><a name="l15330"></a><span class="lineno">15330</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="l15331"></a><span class="lineno">15331</span>&#160;    }</div><div class="line"><a name="l15332"></a><span class="lineno">15332</span>&#160;</div><div class="line"><a name="l15333"></a><span class="lineno">15333</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l15334"></a><span class="lineno">15334</span>&#160;</div><div class="line"><a name="l15335"></a><span class="lineno">15335</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l15336"></a><span class="lineno">15336</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l15337"></a><span class="lineno">15337</span>&#160;    {</div><div class="line"><a name="l15338"></a><span class="lineno">15338</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l15339"></a><span class="lineno">15339</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l15340"></a><span class="lineno">15340</span>&#160;    }</div><div class="line"><a name="l15341"></a><span class="lineno">15341</span>&#160;}</div><div class="line"><a name="l15342"></a><span class="lineno">15342</span>&#160;</div><div class="line"><a name="l15343"></a><span class="lineno">15343</span>&#160;VkResult VmaAllocator_T::BindVulkanBuffer(</div><div class="line"><a name="l15344"></a><span class="lineno">15344</span>&#160;    VkDeviceMemory memory,</div><div class="line"><a name="l15345"></a><span class="lineno">15345</span>&#160;    VkDeviceSize memoryOffset,</div><div class="line"><a name="l15346"></a><span class="lineno">15346</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l15347"></a><span class="lineno">15347</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l15348"></a><span class="lineno">15348</span>&#160;{</div><div class="line"><a name="l15349"></a><span class="lineno">15349</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div><div class="line"><a name="l15350"></a><span class="lineno">15350</span>&#160;    {</div><div class="line"><a name="l15351"></a><span class="lineno">15351</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l15352"></a><span class="lineno">15352</span>&#160;        <span class="keywordflow">if</span>(m_UseKhrBindMemory2 &amp;&amp; m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div><div class="line"><a name="l15353"></a><span class="lineno">15353</span>&#160;        {</div><div class="line"><a name="l15354"></a><span class="lineno">15354</span>&#160;            VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div><div class="line"><a name="l15355"></a><span class="lineno">15355</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div><div class="line"><a name="l15356"></a><span class="lineno">15356</span>&#160;            bindBufferMemoryInfo.buffer = buffer;</div><div class="line"><a name="l15357"></a><span class="lineno">15357</span>&#160;            bindBufferMemoryInfo.memory = memory;</div><div class="line"><a name="l15358"></a><span class="lineno">15358</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div><div class="line"><a name="l15359"></a><span class="lineno">15359</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div><div class="line"><a name="l15360"></a><span class="lineno">15360</span>&#160;        }</div><div class="line"><a name="l15361"></a><span class="lineno">15361</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l15362"></a><span class="lineno">15362</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l15363"></a><span class="lineno">15363</span>&#160;        {</div><div class="line"><a name="l15364"></a><span class="lineno">15364</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div><div class="line"><a name="l15365"></a><span class="lineno">15365</span>&#160;        }</div><div class="line"><a name="l15366"></a><span class="lineno">15366</span>&#160;    }</div><div class="line"><a name="l15367"></a><span class="lineno">15367</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l15368"></a><span class="lineno">15368</span>&#160;    {</div><div class="line"><a name="l15369"></a><span class="lineno">15369</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div><div class="line"><a name="l15370"></a><span class="lineno">15370</span>&#160;    }</div><div class="line"><a name="l15371"></a><span class="lineno">15371</span>&#160;}</div><div class="line"><a name="l15372"></a><span class="lineno">15372</span>&#160;</div><div class="line"><a name="l15373"></a><span class="lineno">15373</span>&#160;VkResult VmaAllocator_T::BindVulkanImage(</div><div class="line"><a name="l15374"></a><span class="lineno">15374</span>&#160;    VkDeviceMemory memory,</div><div class="line"><a name="l15375"></a><span class="lineno">15375</span>&#160;    VkDeviceSize memoryOffset,</div><div class="line"><a name="l15376"></a><span class="lineno">15376</span>&#160;    VkImage image,</div><div class="line"><a name="l15377"></a><span class="lineno">15377</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l15378"></a><span class="lineno">15378</span>&#160;{</div><div class="line"><a name="l15379"></a><span class="lineno">15379</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div><div class="line"><a name="l15380"></a><span class="lineno">15380</span>&#160;    {</div><div class="line"><a name="l15381"></a><span class="lineno">15381</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l15382"></a><span class="lineno">15382</span>&#160;        <span class="keywordflow">if</span>(m_UseKhrBindMemory2 &amp;&amp; m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div><div class="line"><a name="l15383"></a><span class="lineno">15383</span>&#160;        {</div><div class="line"><a name="l15384"></a><span class="lineno">15384</span>&#160;            VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div><div class="line"><a name="l15385"></a><span class="lineno">15385</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div><div class="line"><a name="l15386"></a><span class="lineno">15386</span>&#160;            bindBufferMemoryInfo.image = image;</div><div class="line"><a name="l15387"></a><span class="lineno">15387</span>&#160;            bindBufferMemoryInfo.memory = memory;</div><div class="line"><a name="l15388"></a><span class="lineno">15388</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div><div class="line"><a name="l15389"></a><span class="lineno">15389</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div><div class="line"><a name="l15390"></a><span class="lineno">15390</span>&#160;        }</div><div class="line"><a name="l15391"></a><span class="lineno">15391</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l15392"></a><span class="lineno">15392</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div><div class="line"><a name="l15393"></a><span class="lineno">15393</span>&#160;        {</div><div class="line"><a name="l15394"></a><span class="lineno">15394</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div><div class="line"><a name="l15395"></a><span class="lineno">15395</span>&#160;        }</div><div class="line"><a name="l15396"></a><span class="lineno">15396</span>&#160;    }</div><div class="line"><a name="l15397"></a><span class="lineno">15397</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l15398"></a><span class="lineno">15398</span>&#160;    {</div><div class="line"><a name="l15399"></a><span class="lineno">15399</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div><div class="line"><a name="l15400"></a><span class="lineno">15400</span>&#160;    }</div><div class="line"><a name="l15401"></a><span class="lineno">15401</span>&#160;}</div><div class="line"><a name="l15402"></a><span class="lineno">15402</span>&#160;</div><div class="line"><a name="l15403"></a><span class="lineno">15403</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="l15404"></a><span class="lineno">15404</span>&#160;{</div><div class="line"><a name="l15405"></a><span class="lineno">15405</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l15406"></a><span class="lineno">15406</span>&#160;    {</div><div class="line"><a name="l15407"></a><span class="lineno">15407</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l15408"></a><span class="lineno">15408</span>&#160;    }</div><div class="line"><a name="l15409"></a><span class="lineno">15409</span>&#160;</div><div class="line"><a name="l15410"></a><span class="lineno">15410</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l15411"></a><span class="lineno">15411</span>&#160;    {</div><div class="line"><a name="l15412"></a><span class="lineno">15412</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l15413"></a><span class="lineno">15413</span>&#160;        {</div><div class="line"><a name="l15414"></a><span class="lineno">15414</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l15415"></a><span class="lineno">15415</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l15416"></a><span class="lineno">15416</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="l15417"></a><span class="lineno">15417</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l15418"></a><span class="lineno">15418</span>&#160;            {</div><div class="line"><a name="l15419"></a><span class="lineno">15419</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l15420"></a><span class="lineno">15420</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l15421"></a><span class="lineno">15421</span>&#160;            }</div><div class="line"><a name="l15422"></a><span class="lineno">15422</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15423"></a><span class="lineno">15423</span>&#160;        }</div><div class="line"><a name="l15424"></a><span class="lineno">15424</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l15425"></a><span class="lineno">15425</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l15426"></a><span class="lineno">15426</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l15427"></a><span class="lineno">15427</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l15428"></a><span class="lineno">15428</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l15429"></a><span class="lineno">15429</span>&#160;    }</div><div class="line"><a name="l15430"></a><span class="lineno">15430</span>&#160;}</div><div class="line"><a name="l15431"></a><span class="lineno">15431</span>&#160;</div><div class="line"><a name="l15432"></a><span class="lineno">15432</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="l15433"></a><span class="lineno">15433</span>&#160;{</div><div class="line"><a name="l15434"></a><span class="lineno">15434</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l15435"></a><span class="lineno">15435</span>&#160;    {</div><div class="line"><a name="l15436"></a><span class="lineno">15436</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l15437"></a><span class="lineno">15437</span>&#160;        {</div><div class="line"><a name="l15438"></a><span class="lineno">15438</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l15439"></a><span class="lineno">15439</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l15440"></a><span class="lineno">15440</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l15441"></a><span class="lineno">15441</span>&#160;        }</div><div class="line"><a name="l15442"></a><span class="lineno">15442</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15443"></a><span class="lineno">15443</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l15444"></a><span class="lineno">15444</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l15445"></a><span class="lineno">15445</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15446"></a><span class="lineno">15446</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l15447"></a><span class="lineno">15447</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l15448"></a><span class="lineno">15448</span>&#160;    }</div><div class="line"><a name="l15449"></a><span class="lineno">15449</span>&#160;}</div><div class="line"><a name="l15450"></a><span class="lineno">15450</span>&#160;</div><div class="line"><a name="l15451"></a><span class="lineno">15451</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(</div><div class="line"><a name="l15452"></a><span class="lineno">15452</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l15453"></a><span class="lineno">15453</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l15454"></a><span class="lineno">15454</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l15455"></a><span class="lineno">15455</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l15456"></a><span class="lineno">15456</span>&#160;{</div><div class="line"><a name="l15457"></a><span class="lineno">15457</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l15458"></a><span class="lineno">15458</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l15459"></a><span class="lineno">15459</span>&#160;    {</div><div class="line"><a name="l15460"></a><span class="lineno">15460</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l15461"></a><span class="lineno">15461</span>&#160;        res = BindVulkanBuffer(hAllocation-&gt;GetMemory(), allocationLocalOffset, hBuffer, pNext);</div><div class="line"><a name="l15462"></a><span class="lineno">15462</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15463"></a><span class="lineno">15463</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l15464"></a><span class="lineno">15464</span>&#160;    {</div><div class="line"><a name="l15465"></a><span class="lineno">15465</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l15466"></a><span class="lineno">15466</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="l15467"></a><span class="lineno">15467</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div><div class="line"><a name="l15468"></a><span class="lineno">15468</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15469"></a><span class="lineno">15469</span>&#160;    }</div><div class="line"><a name="l15470"></a><span class="lineno">15470</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l15471"></a><span class="lineno">15471</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l15472"></a><span class="lineno">15472</span>&#160;    }</div><div class="line"><a name="l15473"></a><span class="lineno">15473</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15474"></a><span class="lineno">15474</span>&#160;}</div><div class="line"><a name="l15475"></a><span class="lineno">15475</span>&#160;</div><div class="line"><a name="l15476"></a><span class="lineno">15476</span>&#160;VkResult VmaAllocator_T::BindImageMemory(</div><div class="line"><a name="l15477"></a><span class="lineno">15477</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l15478"></a><span class="lineno">15478</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l15479"></a><span class="lineno">15479</span>&#160;    VkImage hImage,</div><div class="line"><a name="l15480"></a><span class="lineno">15480</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l15481"></a><span class="lineno">15481</span>&#160;{</div><div class="line"><a name="l15482"></a><span class="lineno">15482</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l15483"></a><span class="lineno">15483</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l15484"></a><span class="lineno">15484</span>&#160;    {</div><div class="line"><a name="l15485"></a><span class="lineno">15485</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l15486"></a><span class="lineno">15486</span>&#160;        res = BindVulkanImage(hAllocation-&gt;GetMemory(), allocationLocalOffset, hImage, pNext);</div><div class="line"><a name="l15487"></a><span class="lineno">15487</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15488"></a><span class="lineno">15488</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l15489"></a><span class="lineno">15489</span>&#160;    {</div><div class="line"><a name="l15490"></a><span class="lineno">15490</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l15491"></a><span class="lineno">15491</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="l15492"></a><span class="lineno">15492</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div><div class="line"><a name="l15493"></a><span class="lineno">15493</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15494"></a><span class="lineno">15494</span>&#160;    }</div><div class="line"><a name="l15495"></a><span class="lineno">15495</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l15496"></a><span class="lineno">15496</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l15497"></a><span class="lineno">15497</span>&#160;    }</div><div class="line"><a name="l15498"></a><span class="lineno">15498</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l15499"></a><span class="lineno">15499</span>&#160;}</div><div class="line"><a name="l15500"></a><span class="lineno">15500</span>&#160;</div><div class="line"><a name="l15501"></a><span class="lineno">15501</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div><div class="line"><a name="l15502"></a><span class="lineno">15502</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l15503"></a><span class="lineno">15503</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l15504"></a><span class="lineno">15504</span>&#160;    VMA_CACHE_OPERATION op)</div><div class="line"><a name="l15505"></a><span class="lineno">15505</span>&#160;{</div><div class="line"><a name="l15506"></a><span class="lineno">15506</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l15507"></a><span class="lineno">15507</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div><div class="line"><a name="l15508"></a><span class="lineno">15508</span>&#160;    {</div><div class="line"><a name="l15509"></a><span class="lineno">15509</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div><div class="line"><a name="l15510"></a><span class="lineno">15510</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div><div class="line"><a name="l15511"></a><span class="lineno">15511</span>&#160;</div><div class="line"><a name="l15512"></a><span class="lineno">15512</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l15513"></a><span class="lineno">15513</span>&#160;</div><div class="line"><a name="l15514"></a><span class="lineno">15514</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l15515"></a><span class="lineno">15515</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l15516"></a><span class="lineno">15516</span>&#160;        </div><div class="line"><a name="l15517"></a><span class="lineno">15517</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l15518"></a><span class="lineno">15518</span>&#160;        {</div><div class="line"><a name="l15519"></a><span class="lineno">15519</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l15520"></a><span class="lineno">15520</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l15521"></a><span class="lineno">15521</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l15522"></a><span class="lineno">15522</span>&#160;            {</div><div class="line"><a name="l15523"></a><span class="lineno">15523</span>&#160;                memRange.size = allocationSize - memRange.offset;</div><div class="line"><a name="l15524"></a><span class="lineno">15524</span>&#160;            }</div><div class="line"><a name="l15525"></a><span class="lineno">15525</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l15526"></a><span class="lineno">15526</span>&#160;            {</div><div class="line"><a name="l15527"></a><span class="lineno">15527</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l15528"></a><span class="lineno">15528</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l15529"></a><span class="lineno">15529</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l15530"></a><span class="lineno">15530</span>&#160;                    allocationSize - memRange.offset);</div><div class="line"><a name="l15531"></a><span class="lineno">15531</span>&#160;            }</div><div class="line"><a name="l15532"></a><span class="lineno">15532</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l15533"></a><span class="lineno">15533</span>&#160;</div><div class="line"><a name="l15534"></a><span class="lineno">15534</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l15535"></a><span class="lineno">15535</span>&#160;        {</div><div class="line"><a name="l15536"></a><span class="lineno">15536</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div><div class="line"><a name="l15537"></a><span class="lineno">15537</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l15538"></a><span class="lineno">15538</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l15539"></a><span class="lineno">15539</span>&#160;            {</div><div class="line"><a name="l15540"></a><span class="lineno">15540</span>&#160;                size = allocationSize - offset;</div><div class="line"><a name="l15541"></a><span class="lineno">15541</span>&#160;            }</div><div class="line"><a name="l15542"></a><span class="lineno">15542</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l15543"></a><span class="lineno">15543</span>&#160;            {</div><div class="line"><a name="l15544"></a><span class="lineno">15544</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l15545"></a><span class="lineno">15545</span>&#160;            }</div><div class="line"><a name="l15546"></a><span class="lineno">15546</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div><div class="line"><a name="l15547"></a><span class="lineno">15547</span>&#160;</div><div class="line"><a name="l15548"></a><span class="lineno">15548</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div><div class="line"><a name="l15549"></a><span class="lineno">15549</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l15550"></a><span class="lineno">15550</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div><div class="line"><a name="l15551"></a><span class="lineno">15551</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l15552"></a><span class="lineno">15552</span>&#160;            memRange.offset += allocationOffset;</div><div class="line"><a name="l15553"></a><span class="lineno">15553</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div><div class="line"><a name="l15554"></a><span class="lineno">15554</span>&#160;            </div><div class="line"><a name="l15555"></a><span class="lineno">15555</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l15556"></a><span class="lineno">15556</span>&#160;        }</div><div class="line"><a name="l15557"></a><span class="lineno">15557</span>&#160;        </div><div class="line"><a name="l15558"></a><span class="lineno">15558</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l15559"></a><span class="lineno">15559</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l15560"></a><span class="lineno">15560</span>&#160;        }</div><div class="line"><a name="l15561"></a><span class="lineno">15561</span>&#160;</div><div class="line"><a name="l15562"></a><span class="lineno">15562</span>&#160;        <span class="keywordflow">switch</span>(op)</div><div class="line"><a name="l15563"></a><span class="lineno">15563</span>&#160;        {</div><div class="line"><a name="l15564"></a><span class="lineno">15564</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div><div class="line"><a name="l15565"></a><span class="lineno">15565</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l15566"></a><span class="lineno">15566</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l15567"></a><span class="lineno">15567</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div><div class="line"><a name="l15568"></a><span class="lineno">15568</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l15569"></a><span class="lineno">15569</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l15570"></a><span class="lineno">15570</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l15571"></a><span class="lineno">15571</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l15572"></a><span class="lineno">15572</span>&#160;        }</div><div class="line"><a name="l15573"></a><span class="lineno">15573</span>&#160;    }</div><div class="line"><a name="l15574"></a><span class="lineno">15574</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div><div class="line"><a name="l15575"></a><span class="lineno">15575</span>&#160;}</div><div class="line"><a name="l15576"></a><span class="lineno">15576</span>&#160;</div><div class="line"><a name="l15577"></a><span class="lineno">15577</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="l15578"></a><span class="lineno">15578</span>&#160;{</div><div class="line"><a name="l15579"></a><span class="lineno">15579</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l15580"></a><span class="lineno">15580</span>&#160;</div><div class="line"><a name="l15581"></a><span class="lineno">15581</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l15582"></a><span class="lineno">15582</span>&#160;    {</div><div class="line"><a name="l15583"></a><span class="lineno">15583</span>&#160;        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l15584"></a><span class="lineno">15584</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l15585"></a><span class="lineno">15585</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l15586"></a><span class="lineno">15586</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l15587"></a><span class="lineno">15587</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l15588"></a><span class="lineno">15588</span>&#160;    }</div><div class="line"><a name="l15589"></a><span class="lineno">15589</span>&#160;</div><div class="line"><a name="l15590"></a><span class="lineno">15590</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l15591"></a><span class="lineno">15591</span>&#160;    </div><div class="line"><a name="l15592"></a><span class="lineno">15592</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l15593"></a><span class="lineno">15593</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="l15594"></a><span class="lineno">15594</span>&#160;<span class="comment">    before vkFreeMemory.</span></div><div class="line"><a name="l15595"></a><span class="lineno">15595</span>&#160;<span class="comment"></span></div><div class="line"><a name="l15596"></a><span class="lineno">15596</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div><div class="line"><a name="l15597"></a><span class="lineno">15597</span>&#160;<span class="comment">    {</span></div><div class="line"><a name="l15598"></a><span class="lineno">15598</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div><div class="line"><a name="l15599"></a><span class="lineno">15599</span>&#160;<span class="comment">    }</span></div><div class="line"><a name="l15600"></a><span class="lineno">15600</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l15601"></a><span class="lineno">15601</span>&#160;    </div><div class="line"><a name="l15602"></a><span class="lineno">15602</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l15603"></a><span class="lineno">15603</span>&#160;</div><div class="line"><a name="l15604"></a><span class="lineno">15604</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l15605"></a><span class="lineno">15605</span>&#160;}</div><div class="line"><a name="l15606"></a><span class="lineno">15606</span>&#160;</div><div class="line"><a name="l15607"></a><span class="lineno">15607</span>&#160;uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div><div class="line"><a name="l15608"></a><span class="lineno">15608</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l15609"></a><span class="lineno">15609</span>&#160;    VkBufferCreateInfo dummyBufCreateInfo;</div><div class="line"><a name="l15610"></a><span class="lineno">15610</span>&#160;    VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div><div class="line"><a name="l15611"></a><span class="lineno">15611</span>&#160;</div><div class="line"><a name="l15612"></a><span class="lineno">15612</span>&#160;    uint32_t memoryTypeBits = 0;</div><div class="line"><a name="l15613"></a><span class="lineno">15613</span>&#160;</div><div class="line"><a name="l15614"></a><span class="lineno">15614</span>&#160;    <span class="comment">// Create buffer.</span></div><div class="line"><a name="l15615"></a><span class="lineno">15615</span>&#160;    VkBuffer buf = VK_NULL_HANDLE;</div><div class="line"><a name="l15616"></a><span class="lineno">15616</span>&#160;    VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l15617"></a><span class="lineno">15617</span>&#160;        m_hDevice, &amp;dummyBufCreateInfo, GetAllocationCallbacks(), &amp;buf);</div><div class="line"><a name="l15618"></a><span class="lineno">15618</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l15619"></a><span class="lineno">15619</span>&#160;    {</div><div class="line"><a name="l15620"></a><span class="lineno">15620</span>&#160;        <span class="comment">// Query for supported memory types.</span></div><div class="line"><a name="l15621"></a><span class="lineno">15621</span>&#160;        VkMemoryRequirements memReq;</div><div class="line"><a name="l15622"></a><span class="lineno">15622</span>&#160;        (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &amp;memReq);</div><div class="line"><a name="l15623"></a><span class="lineno">15623</span>&#160;        memoryTypeBits = memReq.memoryTypeBits;</div><div class="line"><a name="l15624"></a><span class="lineno">15624</span>&#160;</div><div class="line"><a name="l15625"></a><span class="lineno">15625</span>&#160;        <span class="comment">// Destroy buffer.</span></div><div class="line"><a name="l15626"></a><span class="lineno">15626</span>&#160;        (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div><div class="line"><a name="l15627"></a><span class="lineno">15627</span>&#160;    }</div><div class="line"><a name="l15628"></a><span class="lineno">15628</span>&#160;</div><div class="line"><a name="l15629"></a><span class="lineno">15629</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div><div class="line"><a name="l15630"></a><span class="lineno">15630</span>&#160;}</div><div class="line"><a name="l15631"></a><span class="lineno">15631</span>&#160;</div><div class="line"><a name="l15632"></a><span class="lineno">15632</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="l15633"></a><span class="lineno">15633</span>&#160;{</div><div class="line"><a name="l15634"></a><span class="lineno">15634</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div><div class="line"><a name="l15635"></a><span class="lineno">15635</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l15636"></a><span class="lineno">15636</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l15637"></a><span class="lineno">15637</span>&#160;    {</div><div class="line"><a name="l15638"></a><span class="lineno">15638</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div><div class="line"><a name="l15639"></a><span class="lineno">15639</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div><div class="line"><a name="l15640"></a><span class="lineno">15640</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l15641"></a><span class="lineno">15641</span>&#160;        {</div><div class="line"><a name="l15642"></a><span class="lineno">15642</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="l15643"></a><span class="lineno">15643</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div><div class="line"><a name="l15644"></a><span class="lineno">15644</span>&#160;            Unmap(hAllocation);</div><div class="line"><a name="l15645"></a><span class="lineno">15645</span>&#160;        }</div><div class="line"><a name="l15646"></a><span class="lineno">15646</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l15647"></a><span class="lineno">15647</span>&#160;        {</div><div class="line"><a name="l15648"></a><span class="lineno">15648</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="l15649"></a><span class="lineno">15649</span>&#160;        }</div><div class="line"><a name="l15650"></a><span class="lineno">15650</span>&#160;    }</div><div class="line"><a name="l15651"></a><span class="lineno">15651</span>&#160;}</div><div class="line"><a name="l15652"></a><span class="lineno">15652</span>&#160;</div><div class="line"><a name="l15653"></a><span class="lineno">15653</span>&#160;uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div><div class="line"><a name="l15654"></a><span class="lineno">15654</span>&#160;{</div><div class="line"><a name="l15655"></a><span class="lineno">15655</span>&#160;    uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div><div class="line"><a name="l15656"></a><span class="lineno">15656</span>&#160;    <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div><div class="line"><a name="l15657"></a><span class="lineno">15657</span>&#160;    {</div><div class="line"><a name="l15658"></a><span class="lineno">15658</span>&#160;        memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div><div class="line"><a name="l15659"></a><span class="lineno">15659</span>&#160;        m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div><div class="line"><a name="l15660"></a><span class="lineno">15660</span>&#160;    }</div><div class="line"><a name="l15661"></a><span class="lineno">15661</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div><div class="line"><a name="l15662"></a><span class="lineno">15662</span>&#160;}</div><div class="line"><a name="l15663"></a><span class="lineno">15663</span>&#160;</div><div class="line"><a name="l15664"></a><span class="lineno">15664</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15665"></a><span class="lineno">15665</span>&#160;</div><div class="line"><a name="l15666"></a><span class="lineno">15666</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l15667"></a><span class="lineno">15667</span>&#160;{</div><div class="line"><a name="l15668"></a><span class="lineno">15668</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l15669"></a><span class="lineno">15669</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l15670"></a><span class="lineno">15670</span>&#160;    {</div><div class="line"><a name="l15671"></a><span class="lineno">15671</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l15672"></a><span class="lineno">15672</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l15673"></a><span class="lineno">15673</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l15674"></a><span class="lineno">15674</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l15675"></a><span class="lineno">15675</span>&#160;        {</div><div class="line"><a name="l15676"></a><span class="lineno">15676</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l15677"></a><span class="lineno">15677</span>&#160;            {</div><div class="line"><a name="l15678"></a><span class="lineno">15678</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l15679"></a><span class="lineno">15679</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l15680"></a><span class="lineno">15680</span>&#160;                json.BeginObject();</div><div class="line"><a name="l15681"></a><span class="lineno">15681</span>&#160;            }</div><div class="line"><a name="l15682"></a><span class="lineno">15682</span>&#160;</div><div class="line"><a name="l15683"></a><span class="lineno">15683</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l15684"></a><span class="lineno">15684</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l15685"></a><span class="lineno">15685</span>&#160;            json.EndString();</div><div class="line"><a name="l15686"></a><span class="lineno">15686</span>&#160;                </div><div class="line"><a name="l15687"></a><span class="lineno">15687</span>&#160;            json.BeginArray();</div><div class="line"><a name="l15688"></a><span class="lineno">15688</span>&#160;</div><div class="line"><a name="l15689"></a><span class="lineno">15689</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="l15690"></a><span class="lineno">15690</span>&#160;            {</div><div class="line"><a name="l15691"></a><span class="lineno">15691</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l15692"></a><span class="lineno">15692</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="l15693"></a><span class="lineno">15693</span>&#160;                hAlloc-&gt;PrintParameters(json);</div><div class="line"><a name="l15694"></a><span class="lineno">15694</span>&#160;                json.EndObject();</div><div class="line"><a name="l15695"></a><span class="lineno">15695</span>&#160;            }</div><div class="line"><a name="l15696"></a><span class="lineno">15696</span>&#160;</div><div class="line"><a name="l15697"></a><span class="lineno">15697</span>&#160;            json.EndArray();</div><div class="line"><a name="l15698"></a><span class="lineno">15698</span>&#160;        }</div><div class="line"><a name="l15699"></a><span class="lineno">15699</span>&#160;    }</div><div class="line"><a name="l15700"></a><span class="lineno">15700</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l15701"></a><span class="lineno">15701</span>&#160;    {</div><div class="line"><a name="l15702"></a><span class="lineno">15702</span>&#160;        json.EndObject();</div><div class="line"><a name="l15703"></a><span class="lineno">15703</span>&#160;    }</div><div class="line"><a name="l15704"></a><span class="lineno">15704</span>&#160;</div><div class="line"><a name="l15705"></a><span class="lineno">15705</span>&#160;    {</div><div class="line"><a name="l15706"></a><span class="lineno">15706</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l15707"></a><span class="lineno">15707</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l15708"></a><span class="lineno">15708</span>&#160;        {</div><div class="line"><a name="l15709"></a><span class="lineno">15709</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l15710"></a><span class="lineno">15710</span>&#160;            {</div><div class="line"><a name="l15711"></a><span class="lineno">15711</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l15712"></a><span class="lineno">15712</span>&#160;                {</div><div class="line"><a name="l15713"></a><span class="lineno">15713</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l15714"></a><span class="lineno">15714</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l15715"></a><span class="lineno">15715</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l15716"></a><span class="lineno">15716</span>&#160;                }</div><div class="line"><a name="l15717"></a><span class="lineno">15717</span>&#160;</div><div class="line"><a name="l15718"></a><span class="lineno">15718</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l15719"></a><span class="lineno">15719</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l15720"></a><span class="lineno">15720</span>&#160;                json.EndString();</div><div class="line"><a name="l15721"></a><span class="lineno">15721</span>&#160;</div><div class="line"><a name="l15722"></a><span class="lineno">15722</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l15723"></a><span class="lineno">15723</span>&#160;            }</div><div class="line"><a name="l15724"></a><span class="lineno">15724</span>&#160;        }</div><div class="line"><a name="l15725"></a><span class="lineno">15725</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l15726"></a><span class="lineno">15726</span>&#160;        {</div><div class="line"><a name="l15727"></a><span class="lineno">15727</span>&#160;            json.EndObject();</div><div class="line"><a name="l15728"></a><span class="lineno">15728</span>&#160;        }</div><div class="line"><a name="l15729"></a><span class="lineno">15729</span>&#160;    }</div><div class="line"><a name="l15730"></a><span class="lineno">15730</span>&#160;</div><div class="line"><a name="l15731"></a><span class="lineno">15731</span>&#160;    <span class="comment">// Custom pools</span></div><div class="line"><a name="l15732"></a><span class="lineno">15732</span>&#160;    {</div><div class="line"><a name="l15733"></a><span class="lineno">15733</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l15734"></a><span class="lineno">15734</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l15735"></a><span class="lineno">15735</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l15736"></a><span class="lineno">15736</span>&#160;        {</div><div class="line"><a name="l15737"></a><span class="lineno">15737</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l15738"></a><span class="lineno">15738</span>&#160;            json.BeginObject();</div><div class="line"><a name="l15739"></a><span class="lineno">15739</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="l15740"></a><span class="lineno">15740</span>&#160;            {</div><div class="line"><a name="l15741"></a><span class="lineno">15741</span>&#160;                json.BeginString();</div><div class="line"><a name="l15742"></a><span class="lineno">15742</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div><div class="line"><a name="l15743"></a><span class="lineno">15743</span>&#160;                json.EndString();</div><div class="line"><a name="l15744"></a><span class="lineno">15744</span>&#160;</div><div class="line"><a name="l15745"></a><span class="lineno">15745</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l15746"></a><span class="lineno">15746</span>&#160;            }</div><div class="line"><a name="l15747"></a><span class="lineno">15747</span>&#160;            json.EndObject();</div><div class="line"><a name="l15748"></a><span class="lineno">15748</span>&#160;        }</div><div class="line"><a name="l15749"></a><span class="lineno">15749</span>&#160;    }</div><div class="line"><a name="l15750"></a><span class="lineno">15750</span>&#160;}</div><div class="line"><a name="l15751"></a><span class="lineno">15751</span>&#160;</div><div class="line"><a name="l15752"></a><span class="lineno">15752</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15753"></a><span class="lineno">15753</span>&#160;</div><div class="line"><a name="l15755"></a><span class="lineno">15755</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l15756"></a><span class="lineno">15756</span>&#160;</div><div class="line"><a name="l15757"></a><span class="lineno">15757</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l15758"></a><span class="lineno">15758</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="l15759"></a><span class="lineno">15759</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l15760"></a><span class="lineno">15760</span>&#160;{</div><div class="line"><a name="l15761"></a><span class="lineno">15761</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l15762"></a><span class="lineno">15762</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l15763"></a><span class="lineno">15763</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="l15764"></a><span class="lineno">15764</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div><div class="line"><a name="l15765"></a><span class="lineno">15765</span>&#160;}</div><div class="line"><a name="l15766"></a><span class="lineno">15766</span>&#160;</div><div class="line"><a name="l15767"></a><span class="lineno">15767</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="l15768"></a><span class="lineno">15768</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l15769"></a><span class="lineno">15769</span>&#160;{</div><div class="line"><a name="l15770"></a><span class="lineno">15770</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l15771"></a><span class="lineno">15771</span>&#160;    {</div><div class="line"><a name="l15772"></a><span class="lineno">15772</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l15773"></a><span class="lineno">15773</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l15774"></a><span class="lineno">15774</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l15775"></a><span class="lineno">15775</span>&#160;    }</div><div class="line"><a name="l15776"></a><span class="lineno">15776</span>&#160;}</div><div class="line"><a name="l15777"></a><span class="lineno">15777</span>&#160;</div><div class="line"><a name="l15778"></a><span class="lineno">15778</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="l15779"></a><span class="lineno">15779</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15780"></a><span class="lineno">15780</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l15781"></a><span class="lineno">15781</span>&#160;{</div><div class="line"><a name="l15782"></a><span class="lineno">15782</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l15783"></a><span class="lineno">15783</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l15784"></a><span class="lineno">15784</span>&#160;}</div><div class="line"><a name="l15785"></a><span class="lineno">15785</span>&#160;</div><div class="line"><a name="l15786"></a><span class="lineno">15786</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="l15787"></a><span class="lineno">15787</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15788"></a><span class="lineno">15788</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l15789"></a><span class="lineno">15789</span>&#160;{</div><div class="line"><a name="l15790"></a><span class="lineno">15790</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l15791"></a><span class="lineno">15791</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l15792"></a><span class="lineno">15792</span>&#160;}</div><div class="line"><a name="l15793"></a><span class="lineno">15793</span>&#160;</div><div class="line"><a name="l15794"></a><span class="lineno">15794</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="l15795"></a><span class="lineno">15795</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15796"></a><span class="lineno">15796</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l15797"></a><span class="lineno">15797</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l15798"></a><span class="lineno">15798</span>&#160;{</div><div class="line"><a name="l15799"></a><span class="lineno">15799</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l15800"></a><span class="lineno">15800</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l15801"></a><span class="lineno">15801</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l15802"></a><span class="lineno">15802</span>&#160;}</div><div class="line"><a name="l15803"></a><span class="lineno">15803</span>&#160;</div><div class="line"><a name="l15804"></a><span class="lineno">15804</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="l15805"></a><span class="lineno">15805</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15806"></a><span class="lineno">15806</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l15807"></a><span class="lineno">15807</span>&#160;{</div><div class="line"><a name="l15808"></a><span class="lineno">15808</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l15809"></a><span class="lineno">15809</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l15810"></a><span class="lineno">15810</span>&#160;</div><div class="line"><a name="l15811"></a><span class="lineno">15811</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l15812"></a><span class="lineno">15812</span>&#160;</div><div class="line"><a name="l15813"></a><span class="lineno">15813</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l15814"></a><span class="lineno">15814</span>&#160;}</div><div class="line"><a name="l15815"></a><span class="lineno">15815</span>&#160;</div><div class="line"><a name="l15816"></a><span class="lineno">15816</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="l15817"></a><span class="lineno">15817</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15818"></a><span class="lineno">15818</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l15819"></a><span class="lineno">15819</span>&#160;{</div><div class="line"><a name="l15820"></a><span class="lineno">15820</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l15821"></a><span class="lineno">15821</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l15822"></a><span class="lineno">15822</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l15823"></a><span class="lineno">15823</span>&#160;}</div><div class="line"><a name="l15824"></a><span class="lineno">15824</span>&#160;</div><div class="line"><a name="l15825"></a><span class="lineno">15825</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15826"></a><span class="lineno">15826</span>&#160;</div><div class="line"><a name="l15827"></a><span class="lineno">15827</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="l15828"></a><span class="lineno">15828</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15829"></a><span class="lineno">15829</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l15830"></a><span class="lineno">15830</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l15831"></a><span class="lineno">15831</span>&#160;{</div><div class="line"><a name="l15832"></a><span class="lineno">15832</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l15833"></a><span class="lineno">15833</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l15834"></a><span class="lineno">15834</span>&#160;</div><div class="line"><a name="l15835"></a><span class="lineno">15835</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l15836"></a><span class="lineno">15836</span>&#160;    {</div><div class="line"><a name="l15837"></a><span class="lineno">15837</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l15838"></a><span class="lineno">15838</span>&#160;        json.BeginObject();</div><div class="line"><a name="l15839"></a><span class="lineno">15839</span>&#160;</div><div class="line"><a name="l15840"></a><span class="lineno">15840</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l15841"></a><span class="lineno">15841</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l15842"></a><span class="lineno">15842</span>&#160;</div><div class="line"><a name="l15843"></a><span class="lineno">15843</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l15844"></a><span class="lineno">15844</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l15845"></a><span class="lineno">15845</span>&#160;    </div><div class="line"><a name="l15846"></a><span class="lineno">15846</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l15847"></a><span class="lineno">15847</span>&#160;        {</div><div class="line"><a name="l15848"></a><span class="lineno">15848</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l15849"></a><span class="lineno">15849</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l15850"></a><span class="lineno">15850</span>&#160;            json.EndString();</div><div class="line"><a name="l15851"></a><span class="lineno">15851</span>&#160;            json.BeginObject();</div><div class="line"><a name="l15852"></a><span class="lineno">15852</span>&#160;</div><div class="line"><a name="l15853"></a><span class="lineno">15853</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l15854"></a><span class="lineno">15854</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l15855"></a><span class="lineno">15855</span>&#160;</div><div class="line"><a name="l15856"></a><span class="lineno">15856</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l15857"></a><span class="lineno">15857</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l15858"></a><span class="lineno">15858</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="l15859"></a><span class="lineno">15859</span>&#160;            {</div><div class="line"><a name="l15860"></a><span class="lineno">15860</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l15861"></a><span class="lineno">15861</span>&#160;            }</div><div class="line"><a name="l15862"></a><span class="lineno">15862</span>&#160;            json.EndArray();</div><div class="line"><a name="l15863"></a><span class="lineno">15863</span>&#160;</div><div class="line"><a name="l15864"></a><span class="lineno">15864</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="l15865"></a><span class="lineno">15865</span>&#160;            {</div><div class="line"><a name="l15866"></a><span class="lineno">15866</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l15867"></a><span class="lineno">15867</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l15868"></a><span class="lineno">15868</span>&#160;            }</div><div class="line"><a name="l15869"></a><span class="lineno">15869</span>&#160;</div><div class="line"><a name="l15870"></a><span class="lineno">15870</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l15871"></a><span class="lineno">15871</span>&#160;            {</div><div class="line"><a name="l15872"></a><span class="lineno">15872</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l15873"></a><span class="lineno">15873</span>&#160;                {</div><div class="line"><a name="l15874"></a><span class="lineno">15874</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l15875"></a><span class="lineno">15875</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l15876"></a><span class="lineno">15876</span>&#160;                    json.EndString();</div><div class="line"><a name="l15877"></a><span class="lineno">15877</span>&#160;</div><div class="line"><a name="l15878"></a><span class="lineno">15878</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l15879"></a><span class="lineno">15879</span>&#160;</div><div class="line"><a name="l15880"></a><span class="lineno">15880</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l15881"></a><span class="lineno">15881</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l15882"></a><span class="lineno">15882</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l15883"></a><span class="lineno">15883</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l15884"></a><span class="lineno">15884</span>&#160;                    {</div><div class="line"><a name="l15885"></a><span class="lineno">15885</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l15886"></a><span class="lineno">15886</span>&#160;                    }</div><div class="line"><a name="l15887"></a><span class="lineno">15887</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l15888"></a><span class="lineno">15888</span>&#160;                    {</div><div class="line"><a name="l15889"></a><span class="lineno">15889</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l15890"></a><span class="lineno">15890</span>&#160;                    }</div><div class="line"><a name="l15891"></a><span class="lineno">15891</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l15892"></a><span class="lineno">15892</span>&#160;                    {</div><div class="line"><a name="l15893"></a><span class="lineno">15893</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l15894"></a><span class="lineno">15894</span>&#160;                    }</div><div class="line"><a name="l15895"></a><span class="lineno">15895</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l15896"></a><span class="lineno">15896</span>&#160;                    {</div><div class="line"><a name="l15897"></a><span class="lineno">15897</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l15898"></a><span class="lineno">15898</span>&#160;                    }</div><div class="line"><a name="l15899"></a><span class="lineno">15899</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l15900"></a><span class="lineno">15900</span>&#160;                    {</div><div class="line"><a name="l15901"></a><span class="lineno">15901</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l15902"></a><span class="lineno">15902</span>&#160;                    }</div><div class="line"><a name="l15903"></a><span class="lineno">15903</span>&#160;                    json.EndArray();</div><div class="line"><a name="l15904"></a><span class="lineno">15904</span>&#160;</div><div class="line"><a name="l15905"></a><span class="lineno">15905</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="l15906"></a><span class="lineno">15906</span>&#160;                    {</div><div class="line"><a name="l15907"></a><span class="lineno">15907</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l15908"></a><span class="lineno">15908</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l15909"></a><span class="lineno">15909</span>&#160;                    }</div><div class="line"><a name="l15910"></a><span class="lineno">15910</span>&#160;</div><div class="line"><a name="l15911"></a><span class="lineno">15911</span>&#160;                    json.EndObject();</div><div class="line"><a name="l15912"></a><span class="lineno">15912</span>&#160;                }</div><div class="line"><a name="l15913"></a><span class="lineno">15913</span>&#160;            }</div><div class="line"><a name="l15914"></a><span class="lineno">15914</span>&#160;</div><div class="line"><a name="l15915"></a><span class="lineno">15915</span>&#160;            json.EndObject();</div><div class="line"><a name="l15916"></a><span class="lineno">15916</span>&#160;        }</div><div class="line"><a name="l15917"></a><span class="lineno">15917</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l15918"></a><span class="lineno">15918</span>&#160;        {</div><div class="line"><a name="l15919"></a><span class="lineno">15919</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l15920"></a><span class="lineno">15920</span>&#160;        }</div><div class="line"><a name="l15921"></a><span class="lineno">15921</span>&#160;</div><div class="line"><a name="l15922"></a><span class="lineno">15922</span>&#160;        json.EndObject();</div><div class="line"><a name="l15923"></a><span class="lineno">15923</span>&#160;    }</div><div class="line"><a name="l15924"></a><span class="lineno">15924</span>&#160;</div><div class="line"><a name="l15925"></a><span class="lineno">15925</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l15926"></a><span class="lineno">15926</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="l15927"></a><span class="lineno">15927</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l15928"></a><span class="lineno">15928</span>&#160;    {</div><div class="line"><a name="l15929"></a><span class="lineno">15929</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l15930"></a><span class="lineno">15930</span>&#160;    }</div><div class="line"><a name="l15931"></a><span class="lineno">15931</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l15932"></a><span class="lineno">15932</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l15933"></a><span class="lineno">15933</span>&#160;}</div><div class="line"><a name="l15934"></a><span class="lineno">15934</span>&#160;</div><div class="line"><a name="l15935"></a><span class="lineno">15935</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="l15936"></a><span class="lineno">15936</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15937"></a><span class="lineno">15937</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l15938"></a><span class="lineno">15938</span>&#160;{</div><div class="line"><a name="l15939"></a><span class="lineno">15939</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l15940"></a><span class="lineno">15940</span>&#160;    {</div><div class="line"><a name="l15941"></a><span class="lineno">15941</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l15942"></a><span class="lineno">15942</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l15943"></a><span class="lineno">15943</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l15944"></a><span class="lineno">15944</span>&#160;    }</div><div class="line"><a name="l15945"></a><span class="lineno">15945</span>&#160;}</div><div class="line"><a name="l15946"></a><span class="lineno">15946</span>&#160;</div><div class="line"><a name="l15947"></a><span class="lineno">15947</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l15948"></a><span class="lineno">15948</span>&#160;</div><div class="line"><a name="l15949"></a><span class="lineno">15949</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l15950"></a><span class="lineno">15950</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="l15951"></a><span class="lineno">15951</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l15952"></a><span class="lineno">15952</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l15953"></a><span class="lineno">15953</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l15954"></a><span class="lineno">15954</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l15955"></a><span class="lineno">15955</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="l15956"></a><span class="lineno">15956</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l15957"></a><span class="lineno">15957</span>&#160;{</div><div class="line"><a name="l15958"></a><span class="lineno">15958</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l15959"></a><span class="lineno">15959</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l15960"></a><span class="lineno">15960</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l15961"></a><span class="lineno">15961</span>&#160;</div><div class="line"><a name="l15962"></a><span class="lineno">15962</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="l15963"></a><span class="lineno">15963</span>&#160;    {</div><div class="line"><a name="l15964"></a><span class="lineno">15964</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="l15965"></a><span class="lineno">15965</span>&#160;    }</div><div class="line"><a name="l15966"></a><span class="lineno">15966</span>&#160;    </div><div class="line"><a name="l15967"></a><span class="lineno">15967</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="l15968"></a><span class="lineno">15968</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="l15969"></a><span class="lineno">15969</span>&#160;</div><div class="line"><a name="l15970"></a><span class="lineno">15970</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l15971"></a><span class="lineno">15971</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="l15972"></a><span class="lineno">15972</span>&#160;    {</div><div class="line"><a name="l15973"></a><span class="lineno">15973</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="l15974"></a><span class="lineno">15974</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15975"></a><span class="lineno">15975</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="l15976"></a><span class="lineno">15976</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="l15977"></a><span class="lineno">15977</span>&#160;        {</div><div class="line"><a name="l15978"></a><span class="lineno">15978</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l15979"></a><span class="lineno">15979</span>&#160;        }</div><div class="line"><a name="l15980"></a><span class="lineno">15980</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15981"></a><span class="lineno">15981</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="l15982"></a><span class="lineno">15982</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l15983"></a><span class="lineno">15983</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15984"></a><span class="lineno">15984</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="l15985"></a><span class="lineno">15985</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l15986"></a><span class="lineno">15986</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="l15987"></a><span class="lineno">15987</span>&#160;        {</div><div class="line"><a name="l15988"></a><span class="lineno">15988</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l15989"></a><span class="lineno">15989</span>&#160;        }</div><div class="line"><a name="l15990"></a><span class="lineno">15990</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15991"></a><span class="lineno">15991</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="l15992"></a><span class="lineno">15992</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l15993"></a><span class="lineno">15993</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l15994"></a><span class="lineno">15994</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15995"></a><span class="lineno">15995</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l15996"></a><span class="lineno">15996</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l15997"></a><span class="lineno">15997</span>&#160;    }</div><div class="line"><a name="l15998"></a><span class="lineno">15998</span>&#160;</div><div class="line"><a name="l15999"></a><span class="lineno">15999</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l16000"></a><span class="lineno">16000</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l16001"></a><span class="lineno">16001</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l16002"></a><span class="lineno">16002</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l16003"></a><span class="lineno">16003</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l16004"></a><span class="lineno">16004</span>&#160;    {</div><div class="line"><a name="l16005"></a><span class="lineno">16005</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l16006"></a><span class="lineno">16006</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l16007"></a><span class="lineno">16007</span>&#160;        {</div><div class="line"><a name="l16008"></a><span class="lineno">16008</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l16009"></a><span class="lineno">16009</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l16010"></a><span class="lineno">16010</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l16011"></a><span class="lineno">16011</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l16012"></a><span class="lineno">16012</span>&#160;            {</div><div class="line"><a name="l16013"></a><span class="lineno">16013</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="l16014"></a><span class="lineno">16014</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l16015"></a><span class="lineno">16015</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l16016"></a><span class="lineno">16016</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l16017"></a><span class="lineno">16017</span>&#160;                {</div><div class="line"><a name="l16018"></a><span class="lineno">16018</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l16019"></a><span class="lineno">16019</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l16020"></a><span class="lineno">16020</span>&#160;                    {</div><div class="line"><a name="l16021"></a><span class="lineno">16021</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l16022"></a><span class="lineno">16022</span>&#160;                    }</div><div class="line"><a name="l16023"></a><span class="lineno">16023</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l16024"></a><span class="lineno">16024</span>&#160;                }</div><div class="line"><a name="l16025"></a><span class="lineno">16025</span>&#160;            }</div><div class="line"><a name="l16026"></a><span class="lineno">16026</span>&#160;        }</div><div class="line"><a name="l16027"></a><span class="lineno">16027</span>&#160;    }</div><div class="line"><a name="l16028"></a><span class="lineno">16028</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l16029"></a><span class="lineno">16029</span>&#160;}</div><div class="line"><a name="l16030"></a><span class="lineno">16030</span>&#160;</div><div class="line"><a name="l16031"></a><span class="lineno">16031</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l16032"></a><span class="lineno">16032</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16033"></a><span class="lineno">16033</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l16034"></a><span class="lineno">16034</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="l16035"></a><span class="lineno">16035</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l16036"></a><span class="lineno">16036</span>&#160;{</div><div class="line"><a name="l16037"></a><span class="lineno">16037</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l16038"></a><span class="lineno">16038</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l16039"></a><span class="lineno">16039</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l16040"></a><span class="lineno">16040</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l16041"></a><span class="lineno">16041</span>&#160;</div><div class="line"><a name="l16042"></a><span class="lineno">16042</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l16043"></a><span class="lineno">16043</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l16044"></a><span class="lineno">16044</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l16045"></a><span class="lineno">16045</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l16046"></a><span class="lineno">16046</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l16047"></a><span class="lineno">16047</span>&#160;    {</div><div class="line"><a name="l16048"></a><span class="lineno">16048</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l16049"></a><span class="lineno">16049</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l16050"></a><span class="lineno">16050</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l16051"></a><span class="lineno">16051</span>&#160;</div><div class="line"><a name="l16052"></a><span class="lineno">16052</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l16053"></a><span class="lineno">16053</span>&#160;            allocator,</div><div class="line"><a name="l16054"></a><span class="lineno">16054</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l16055"></a><span class="lineno">16055</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l16056"></a><span class="lineno">16056</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l16057"></a><span class="lineno">16057</span>&#160;</div><div class="line"><a name="l16058"></a><span class="lineno">16058</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l16059"></a><span class="lineno">16059</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l16060"></a><span class="lineno">16060</span>&#160;    }</div><div class="line"><a name="l16061"></a><span class="lineno">16061</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16062"></a><span class="lineno">16062</span>&#160;}</div><div class="line"><a name="l16063"></a><span class="lineno">16063</span>&#160;</div><div class="line"><a name="l16064"></a><span class="lineno">16064</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l16065"></a><span class="lineno">16065</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16066"></a><span class="lineno">16066</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l16067"></a><span class="lineno">16067</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="l16068"></a><span class="lineno">16068</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l16069"></a><span class="lineno">16069</span>&#160;{</div><div class="line"><a name="l16070"></a><span class="lineno">16070</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l16071"></a><span class="lineno">16071</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l16072"></a><span class="lineno">16072</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l16073"></a><span class="lineno">16073</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l16074"></a><span class="lineno">16074</span>&#160;</div><div class="line"><a name="l16075"></a><span class="lineno">16075</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l16076"></a><span class="lineno">16076</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l16077"></a><span class="lineno">16077</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l16078"></a><span class="lineno">16078</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l16079"></a><span class="lineno">16079</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l16080"></a><span class="lineno">16080</span>&#160;    {</div><div class="line"><a name="l16081"></a><span class="lineno">16081</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l16082"></a><span class="lineno">16082</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l16083"></a><span class="lineno">16083</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l16084"></a><span class="lineno">16084</span>&#160;</div><div class="line"><a name="l16085"></a><span class="lineno">16085</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l16086"></a><span class="lineno">16086</span>&#160;            allocator,</div><div class="line"><a name="l16087"></a><span class="lineno">16087</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l16088"></a><span class="lineno">16088</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l16089"></a><span class="lineno">16089</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l16090"></a><span class="lineno">16090</span>&#160;</div><div class="line"><a name="l16091"></a><span class="lineno">16091</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l16092"></a><span class="lineno">16092</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l16093"></a><span class="lineno">16093</span>&#160;    }</div><div class="line"><a name="l16094"></a><span class="lineno">16094</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16095"></a><span class="lineno">16095</span>&#160;}</div><div class="line"><a name="l16096"></a><span class="lineno">16096</span>&#160;</div><div class="line"><a name="l16097"></a><span class="lineno">16097</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l16098"></a><span class="lineno">16098</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16099"></a><span class="lineno">16099</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="l16100"></a><span class="lineno">16100</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l16101"></a><span class="lineno">16101</span>&#160;{</div><div class="line"><a name="l16102"></a><span class="lineno">16102</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l16103"></a><span class="lineno">16103</span>&#160;    </div><div class="line"><a name="l16104"></a><span class="lineno">16104</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l16105"></a><span class="lineno">16105</span>&#160;    </div><div class="line"><a name="l16106"></a><span class="lineno">16106</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16107"></a><span class="lineno">16107</span>&#160;    </div><div class="line"><a name="l16108"></a><span class="lineno">16108</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l16109"></a><span class="lineno">16109</span>&#160;    </div><div class="line"><a name="l16110"></a><span class="lineno">16110</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16111"></a><span class="lineno">16111</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16112"></a><span class="lineno">16112</span>&#160;    {</div><div class="line"><a name="l16113"></a><span class="lineno">16113</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div><div class="line"><a name="l16114"></a><span class="lineno">16114</span>&#160;    }</div><div class="line"><a name="l16115"></a><span class="lineno">16115</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16116"></a><span class="lineno">16116</span>&#160;    </div><div class="line"><a name="l16117"></a><span class="lineno">16117</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16118"></a><span class="lineno">16118</span>&#160;}</div><div class="line"><a name="l16119"></a><span class="lineno">16119</span>&#160;</div><div class="line"><a name="l16120"></a><span class="lineno">16120</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="l16121"></a><span class="lineno">16121</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16122"></a><span class="lineno">16122</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l16123"></a><span class="lineno">16123</span>&#160;{</div><div class="line"><a name="l16124"></a><span class="lineno">16124</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16125"></a><span class="lineno">16125</span>&#160;    </div><div class="line"><a name="l16126"></a><span class="lineno">16126</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l16127"></a><span class="lineno">16127</span>&#160;    {</div><div class="line"><a name="l16128"></a><span class="lineno">16128</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l16129"></a><span class="lineno">16129</span>&#160;    }</div><div class="line"><a name="l16130"></a><span class="lineno">16130</span>&#160;    </div><div class="line"><a name="l16131"></a><span class="lineno">16131</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l16132"></a><span class="lineno">16132</span>&#160;    </div><div class="line"><a name="l16133"></a><span class="lineno">16133</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16134"></a><span class="lineno">16134</span>&#160;    </div><div class="line"><a name="l16135"></a><span class="lineno">16135</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16136"></a><span class="lineno">16136</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16137"></a><span class="lineno">16137</span>&#160;    {</div><div class="line"><a name="l16138"></a><span class="lineno">16138</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l16139"></a><span class="lineno">16139</span>&#160;    }</div><div class="line"><a name="l16140"></a><span class="lineno">16140</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16141"></a><span class="lineno">16141</span>&#160;</div><div class="line"><a name="l16142"></a><span class="lineno">16142</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l16143"></a><span class="lineno">16143</span>&#160;}</div><div class="line"><a name="l16144"></a><span class="lineno">16144</span>&#160;</div><div class="line"><a name="l16145"></a><span class="lineno">16145</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="l16146"></a><span class="lineno">16146</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16147"></a><span class="lineno">16147</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l16148"></a><span class="lineno">16148</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l16149"></a><span class="lineno">16149</span>&#160;{</div><div class="line"><a name="l16150"></a><span class="lineno">16150</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l16151"></a><span class="lineno">16151</span>&#160;</div><div class="line"><a name="l16152"></a><span class="lineno">16152</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16153"></a><span class="lineno">16153</span>&#160;</div><div class="line"><a name="l16154"></a><span class="lineno">16154</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l16155"></a><span class="lineno">16155</span>&#160;}</div><div class="line"><a name="l16156"></a><span class="lineno">16156</span>&#160;</div><div class="line"><a name="l16157"></a><span class="lineno">16157</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="l16158"></a><span class="lineno">16158</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16159"></a><span class="lineno">16159</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l16160"></a><span class="lineno">16160</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l16161"></a><span class="lineno">16161</span>&#160;{</div><div class="line"><a name="l16162"></a><span class="lineno">16162</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l16163"></a><span class="lineno">16163</span>&#160;</div><div class="line"><a name="l16164"></a><span class="lineno">16164</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16165"></a><span class="lineno">16165</span>&#160;</div><div class="line"><a name="l16166"></a><span class="lineno">16166</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16167"></a><span class="lineno">16167</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16168"></a><span class="lineno">16168</span>&#160;    {</div><div class="line"><a name="l16169"></a><span class="lineno">16169</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l16170"></a><span class="lineno">16170</span>&#160;    }</div><div class="line"><a name="l16171"></a><span class="lineno">16171</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16172"></a><span class="lineno">16172</span>&#160;</div><div class="line"><a name="l16173"></a><span class="lineno">16173</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l16174"></a><span class="lineno">16174</span>&#160;}</div><div class="line"><a name="l16175"></a><span class="lineno">16175</span>&#160;</div><div class="line"><a name="l16176"></a><span class="lineno">16176</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="l16177"></a><span class="lineno">16177</span>&#160;{</div><div class="line"><a name="l16178"></a><span class="lineno">16178</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l16179"></a><span class="lineno">16179</span>&#160;</div><div class="line"><a name="l16180"></a><span class="lineno">16180</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16181"></a><span class="lineno">16181</span>&#160;</div><div class="line"><a name="l16182"></a><span class="lineno">16182</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div><div class="line"><a name="l16183"></a><span class="lineno">16183</span>&#160;</div><div class="line"><a name="l16184"></a><span class="lineno">16184</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div><div class="line"><a name="l16185"></a><span class="lineno">16185</span>&#160;}</div><div class="line"><a name="l16186"></a><span class="lineno">16186</span>&#160;</div><div class="line"><a name="l16187"></a><span class="lineno">16187</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l16188"></a><span class="lineno">16188</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16189"></a><span class="lineno">16189</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l16190"></a><span class="lineno">16190</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="l16191"></a><span class="lineno">16191</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l16192"></a><span class="lineno">16192</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16193"></a><span class="lineno">16193</span>&#160;{</div><div class="line"><a name="l16194"></a><span class="lineno">16194</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l16195"></a><span class="lineno">16195</span>&#160;</div><div class="line"><a name="l16196"></a><span class="lineno">16196</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l16197"></a><span class="lineno">16197</span>&#160;</div><div class="line"><a name="l16198"></a><span class="lineno">16198</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16199"></a><span class="lineno">16199</span>&#160;</div><div class="line"><a name="l16200"></a><span class="lineno">16200</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16201"></a><span class="lineno">16201</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l16202"></a><span class="lineno">16202</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l16203"></a><span class="lineno">16203</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l16204"></a><span class="lineno">16204</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16205"></a><span class="lineno">16205</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16206"></a><span class="lineno">16206</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l16207"></a><span class="lineno">16207</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l16208"></a><span class="lineno">16208</span>&#160;        1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16209"></a><span class="lineno">16209</span>&#160;        pAllocation);</div><div class="line"><a name="l16210"></a><span class="lineno">16210</span>&#160;</div><div class="line"><a name="l16211"></a><span class="lineno">16211</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16212"></a><span class="lineno">16212</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16213"></a><span class="lineno">16213</span>&#160;    {</div><div class="line"><a name="l16214"></a><span class="lineno">16214</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div><div class="line"><a name="l16215"></a><span class="lineno">16215</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16216"></a><span class="lineno">16216</span>&#160;            *pVkMemoryRequirements,</div><div class="line"><a name="l16217"></a><span class="lineno">16217</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l16218"></a><span class="lineno">16218</span>&#160;            *pAllocation);</div><div class="line"><a name="l16219"></a><span class="lineno">16219</span>&#160;    }</div><div class="line"><a name="l16220"></a><span class="lineno">16220</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16221"></a><span class="lineno">16221</span>&#160;        </div><div class="line"><a name="l16222"></a><span class="lineno">16222</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l16223"></a><span class="lineno">16223</span>&#160;    {</div><div class="line"><a name="l16224"></a><span class="lineno">16224</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l16225"></a><span class="lineno">16225</span>&#160;    }</div><div class="line"><a name="l16226"></a><span class="lineno">16226</span>&#160;</div><div class="line"><a name="l16227"></a><span class="lineno">16227</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l16228"></a><span class="lineno">16228</span>&#160;}</div><div class="line"><a name="l16229"></a><span class="lineno">16229</span>&#160;</div><div class="line"><a name="l16230"></a><span class="lineno">16230</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div><div class="line"><a name="l16231"></a><span class="lineno">16231</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16232"></a><span class="lineno">16232</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l16233"></a><span class="lineno">16233</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="l16234"></a><span class="lineno">16234</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l16235"></a><span class="lineno">16235</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l16236"></a><span class="lineno">16236</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16237"></a><span class="lineno">16237</span>&#160;{</div><div class="line"><a name="l16238"></a><span class="lineno">16238</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div><div class="line"><a name="l16239"></a><span class="lineno">16239</span>&#160;    {</div><div class="line"><a name="l16240"></a><span class="lineno">16240</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l16241"></a><span class="lineno">16241</span>&#160;    }</div><div class="line"><a name="l16242"></a><span class="lineno">16242</span>&#160;</div><div class="line"><a name="l16243"></a><span class="lineno">16243</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocations);</div><div class="line"><a name="l16244"></a><span class="lineno">16244</span>&#160;</div><div class="line"><a name="l16245"></a><span class="lineno">16245</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryPages&quot;</span>);</div><div class="line"><a name="l16246"></a><span class="lineno">16246</span>&#160;</div><div class="line"><a name="l16247"></a><span class="lineno">16247</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16248"></a><span class="lineno">16248</span>&#160;</div><div class="line"><a name="l16249"></a><span class="lineno">16249</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16250"></a><span class="lineno">16250</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l16251"></a><span class="lineno">16251</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l16252"></a><span class="lineno">16252</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l16253"></a><span class="lineno">16253</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16254"></a><span class="lineno">16254</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16255"></a><span class="lineno">16255</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l16256"></a><span class="lineno">16256</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l16257"></a><span class="lineno">16257</span>&#160;        allocationCount,</div><div class="line"><a name="l16258"></a><span class="lineno">16258</span>&#160;        pAllocations);</div><div class="line"><a name="l16259"></a><span class="lineno">16259</span>&#160;</div><div class="line"><a name="l16260"></a><span class="lineno">16260</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16261"></a><span class="lineno">16261</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16262"></a><span class="lineno">16262</span>&#160;    {</div><div class="line"><a name="l16263"></a><span class="lineno">16263</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryPages(</div><div class="line"><a name="l16264"></a><span class="lineno">16264</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16265"></a><span class="lineno">16265</span>&#160;            *pVkMemoryRequirements,</div><div class="line"><a name="l16266"></a><span class="lineno">16266</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l16267"></a><span class="lineno">16267</span>&#160;            (uint64_t)allocationCount,</div><div class="line"><a name="l16268"></a><span class="lineno">16268</span>&#160;            pAllocations);</div><div class="line"><a name="l16269"></a><span class="lineno">16269</span>&#160;    }</div><div class="line"><a name="l16270"></a><span class="lineno">16270</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16271"></a><span class="lineno">16271</span>&#160;        </div><div class="line"><a name="l16272"></a><span class="lineno">16272</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l16273"></a><span class="lineno">16273</span>&#160;    {</div><div class="line"><a name="l16274"></a><span class="lineno">16274</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocationCount; ++i)</div><div class="line"><a name="l16275"></a><span class="lineno">16275</span>&#160;        {</div><div class="line"><a name="l16276"></a><span class="lineno">16276</span>&#160;            allocator-&gt;GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div><div class="line"><a name="l16277"></a><span class="lineno">16277</span>&#160;        }</div><div class="line"><a name="l16278"></a><span class="lineno">16278</span>&#160;    }</div><div class="line"><a name="l16279"></a><span class="lineno">16279</span>&#160;</div><div class="line"><a name="l16280"></a><span class="lineno">16280</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l16281"></a><span class="lineno">16281</span>&#160;}</div><div class="line"><a name="l16282"></a><span class="lineno">16282</span>&#160;</div><div class="line"><a name="l16283"></a><span class="lineno">16283</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l16284"></a><span class="lineno">16284</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16285"></a><span class="lineno">16285</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l16286"></a><span class="lineno">16286</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="l16287"></a><span class="lineno">16287</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l16288"></a><span class="lineno">16288</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16289"></a><span class="lineno">16289</span>&#160;{</div><div class="line"><a name="l16290"></a><span class="lineno">16290</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l16291"></a><span class="lineno">16291</span>&#160;</div><div class="line"><a name="l16292"></a><span class="lineno">16292</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l16293"></a><span class="lineno">16293</span>&#160;</div><div class="line"><a name="l16294"></a><span class="lineno">16294</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16295"></a><span class="lineno">16295</span>&#160;</div><div class="line"><a name="l16296"></a><span class="lineno">16296</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l16297"></a><span class="lineno">16297</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l16298"></a><span class="lineno">16298</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l16299"></a><span class="lineno">16299</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l16300"></a><span class="lineno">16300</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l16301"></a><span class="lineno">16301</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l16302"></a><span class="lineno">16302</span>&#160;</div><div class="line"><a name="l16303"></a><span class="lineno">16303</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16304"></a><span class="lineno">16304</span>&#160;        vkMemReq,</div><div class="line"><a name="l16305"></a><span class="lineno">16305</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l16306"></a><span class="lineno">16306</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l16307"></a><span class="lineno">16307</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16308"></a><span class="lineno">16308</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16309"></a><span class="lineno">16309</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l16310"></a><span class="lineno">16310</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l16311"></a><span class="lineno">16311</span>&#160;        1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16312"></a><span class="lineno">16312</span>&#160;        pAllocation);</div><div class="line"><a name="l16313"></a><span class="lineno">16313</span>&#160;</div><div class="line"><a name="l16314"></a><span class="lineno">16314</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16315"></a><span class="lineno">16315</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16316"></a><span class="lineno">16316</span>&#160;    {</div><div class="line"><a name="l16317"></a><span class="lineno">16317</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div><div class="line"><a name="l16318"></a><span class="lineno">16318</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16319"></a><span class="lineno">16319</span>&#160;            vkMemReq,</div><div class="line"><a name="l16320"></a><span class="lineno">16320</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l16321"></a><span class="lineno">16321</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l16322"></a><span class="lineno">16322</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l16323"></a><span class="lineno">16323</span>&#160;            *pAllocation);</div><div class="line"><a name="l16324"></a><span class="lineno">16324</span>&#160;    }</div><div class="line"><a name="l16325"></a><span class="lineno">16325</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16326"></a><span class="lineno">16326</span>&#160;</div><div class="line"><a name="l16327"></a><span class="lineno">16327</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l16328"></a><span class="lineno">16328</span>&#160;    {</div><div class="line"><a name="l16329"></a><span class="lineno">16329</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l16330"></a><span class="lineno">16330</span>&#160;    }</div><div class="line"><a name="l16331"></a><span class="lineno">16331</span>&#160;</div><div class="line"><a name="l16332"></a><span class="lineno">16332</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l16333"></a><span class="lineno">16333</span>&#160;}</div><div class="line"><a name="l16334"></a><span class="lineno">16334</span>&#160;</div><div class="line"><a name="l16335"></a><span class="lineno">16335</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l16336"></a><span class="lineno">16336</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16337"></a><span class="lineno">16337</span>&#160;    VkImage image,</div><div class="line"><a name="l16338"></a><span class="lineno">16338</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="l16339"></a><span class="lineno">16339</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l16340"></a><span class="lineno">16340</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16341"></a><span class="lineno">16341</span>&#160;{</div><div class="line"><a name="l16342"></a><span class="lineno">16342</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l16343"></a><span class="lineno">16343</span>&#160;</div><div class="line"><a name="l16344"></a><span class="lineno">16344</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l16345"></a><span class="lineno">16345</span>&#160;</div><div class="line"><a name="l16346"></a><span class="lineno">16346</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16347"></a><span class="lineno">16347</span>&#160;</div><div class="line"><a name="l16348"></a><span class="lineno">16348</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l16349"></a><span class="lineno">16349</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l16350"></a><span class="lineno">16350</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l16351"></a><span class="lineno">16351</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l16352"></a><span class="lineno">16352</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l16353"></a><span class="lineno">16353</span>&#160;</div><div class="line"><a name="l16354"></a><span class="lineno">16354</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16355"></a><span class="lineno">16355</span>&#160;        vkMemReq,</div><div class="line"><a name="l16356"></a><span class="lineno">16356</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l16357"></a><span class="lineno">16357</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l16358"></a><span class="lineno">16358</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16359"></a><span class="lineno">16359</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16360"></a><span class="lineno">16360</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l16361"></a><span class="lineno">16361</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l16362"></a><span class="lineno">16362</span>&#160;        1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16363"></a><span class="lineno">16363</span>&#160;        pAllocation);</div><div class="line"><a name="l16364"></a><span class="lineno">16364</span>&#160;</div><div class="line"><a name="l16365"></a><span class="lineno">16365</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16366"></a><span class="lineno">16366</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16367"></a><span class="lineno">16367</span>&#160;    {</div><div class="line"><a name="l16368"></a><span class="lineno">16368</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div><div class="line"><a name="l16369"></a><span class="lineno">16369</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16370"></a><span class="lineno">16370</span>&#160;            vkMemReq,</div><div class="line"><a name="l16371"></a><span class="lineno">16371</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l16372"></a><span class="lineno">16372</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l16373"></a><span class="lineno">16373</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l16374"></a><span class="lineno">16374</span>&#160;            *pAllocation);</div><div class="line"><a name="l16375"></a><span class="lineno">16375</span>&#160;    }</div><div class="line"><a name="l16376"></a><span class="lineno">16376</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16377"></a><span class="lineno">16377</span>&#160;</div><div class="line"><a name="l16378"></a><span class="lineno">16378</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l16379"></a><span class="lineno">16379</span>&#160;    {</div><div class="line"><a name="l16380"></a><span class="lineno">16380</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l16381"></a><span class="lineno">16381</span>&#160;    }</div><div class="line"><a name="l16382"></a><span class="lineno">16382</span>&#160;</div><div class="line"><a name="l16383"></a><span class="lineno">16383</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l16384"></a><span class="lineno">16384</span>&#160;}</div><div class="line"><a name="l16385"></a><span class="lineno">16385</span>&#160;</div><div class="line"><a name="l16386"></a><span class="lineno">16386</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="l16387"></a><span class="lineno">16387</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16388"></a><span class="lineno">16388</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l16389"></a><span class="lineno">16389</span>&#160;{</div><div class="line"><a name="l16390"></a><span class="lineno">16390</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16391"></a><span class="lineno">16391</span>&#160;    </div><div class="line"><a name="l16392"></a><span class="lineno">16392</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l16393"></a><span class="lineno">16393</span>&#160;    {</div><div class="line"><a name="l16394"></a><span class="lineno">16394</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l16395"></a><span class="lineno">16395</span>&#160;    }</div><div class="line"><a name="l16396"></a><span class="lineno">16396</span>&#160;    </div><div class="line"><a name="l16397"></a><span class="lineno">16397</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l16398"></a><span class="lineno">16398</span>&#160;    </div><div class="line"><a name="l16399"></a><span class="lineno">16399</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16400"></a><span class="lineno">16400</span>&#160;</div><div class="line"><a name="l16401"></a><span class="lineno">16401</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16402"></a><span class="lineno">16402</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16403"></a><span class="lineno">16403</span>&#160;    {</div><div class="line"><a name="l16404"></a><span class="lineno">16404</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div><div class="line"><a name="l16405"></a><span class="lineno">16405</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16406"></a><span class="lineno">16406</span>&#160;            allocation);</div><div class="line"><a name="l16407"></a><span class="lineno">16407</span>&#160;    }</div><div class="line"><a name="l16408"></a><span class="lineno">16408</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16409"></a><span class="lineno">16409</span>&#160;    </div><div class="line"><a name="l16410"></a><span class="lineno">16410</span>&#160;    allocator-&gt;FreeMemory(</div><div class="line"><a name="l16411"></a><span class="lineno">16411</span>&#160;        1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16412"></a><span class="lineno">16412</span>&#160;        &amp;allocation);</div><div class="line"><a name="l16413"></a><span class="lineno">16413</span>&#160;}</div><div class="line"><a name="l16414"></a><span class="lineno">16414</span>&#160;</div><div class="line"><a name="l16415"></a><span class="lineno">16415</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</a>(</div><div class="line"><a name="l16416"></a><span class="lineno">16416</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16417"></a><span class="lineno">16417</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l16418"></a><span class="lineno">16418</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div><div class="line"><a name="l16419"></a><span class="lineno">16419</span>&#160;{</div><div class="line"><a name="l16420"></a><span class="lineno">16420</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div><div class="line"><a name="l16421"></a><span class="lineno">16421</span>&#160;    {</div><div class="line"><a name="l16422"></a><span class="lineno">16422</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l16423"></a><span class="lineno">16423</span>&#160;    }</div><div class="line"><a name="l16424"></a><span class="lineno">16424</span>&#160;</div><div class="line"><a name="l16425"></a><span class="lineno">16425</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16426"></a><span class="lineno">16426</span>&#160;    </div><div class="line"><a name="l16427"></a><span class="lineno">16427</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemoryPages&quot;</span>);</div><div class="line"><a name="l16428"></a><span class="lineno">16428</span>&#160;    </div><div class="line"><a name="l16429"></a><span class="lineno">16429</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16430"></a><span class="lineno">16430</span>&#160;</div><div class="line"><a name="l16431"></a><span class="lineno">16431</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16432"></a><span class="lineno">16432</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16433"></a><span class="lineno">16433</span>&#160;    {</div><div class="line"><a name="l16434"></a><span class="lineno">16434</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemoryPages(</div><div class="line"><a name="l16435"></a><span class="lineno">16435</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16436"></a><span class="lineno">16436</span>&#160;            (uint64_t)allocationCount,</div><div class="line"><a name="l16437"></a><span class="lineno">16437</span>&#160;            pAllocations);</div><div class="line"><a name="l16438"></a><span class="lineno">16438</span>&#160;    }</div><div class="line"><a name="l16439"></a><span class="lineno">16439</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16440"></a><span class="lineno">16440</span>&#160;    </div><div class="line"><a name="l16441"></a><span class="lineno">16441</span>&#160;    allocator-&gt;FreeMemory(allocationCount, pAllocations);</div><div class="line"><a name="l16442"></a><span class="lineno">16442</span>&#160;}</div><div class="line"><a name="l16443"></a><span class="lineno">16443</span>&#160;</div><div class="line"><a name="l16444"></a><span class="lineno">16444</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div><div class="line"><a name="l16445"></a><span class="lineno">16445</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16446"></a><span class="lineno">16446</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16447"></a><span class="lineno">16447</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l16448"></a><span class="lineno">16448</span>&#160;{</div><div class="line"><a name="l16449"></a><span class="lineno">16449</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16450"></a><span class="lineno">16450</span>&#160;    </div><div class="line"><a name="l16451"></a><span class="lineno">16451</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaResizeAllocation&quot;</span>);</div><div class="line"><a name="l16452"></a><span class="lineno">16452</span>&#160;    </div><div class="line"><a name="l16453"></a><span class="lineno">16453</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16454"></a><span class="lineno">16454</span>&#160;</div><div class="line"><a name="l16455"></a><span class="lineno">16455</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;ResizeAllocation(allocation, newSize);</div><div class="line"><a name="l16456"></a><span class="lineno">16456</span>&#160;}</div><div class="line"><a name="l16457"></a><span class="lineno">16457</span>&#160;</div><div class="line"><a name="l16458"></a><span class="lineno">16458</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="l16459"></a><span class="lineno">16459</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16460"></a><span class="lineno">16460</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16461"></a><span class="lineno">16461</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16462"></a><span class="lineno">16462</span>&#160;{</div><div class="line"><a name="l16463"></a><span class="lineno">16463</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l16464"></a><span class="lineno">16464</span>&#160;</div><div class="line"><a name="l16465"></a><span class="lineno">16465</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16466"></a><span class="lineno">16466</span>&#160;</div><div class="line"><a name="l16467"></a><span class="lineno">16467</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16468"></a><span class="lineno">16468</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16469"></a><span class="lineno">16469</span>&#160;    {</div><div class="line"><a name="l16470"></a><span class="lineno">16470</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div><div class="line"><a name="l16471"></a><span class="lineno">16471</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16472"></a><span class="lineno">16472</span>&#160;            allocation);</div><div class="line"><a name="l16473"></a><span class="lineno">16473</span>&#160;    }</div><div class="line"><a name="l16474"></a><span class="lineno">16474</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16475"></a><span class="lineno">16475</span>&#160;</div><div class="line"><a name="l16476"></a><span class="lineno">16476</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l16477"></a><span class="lineno">16477</span>&#160;}</div><div class="line"><a name="l16478"></a><span class="lineno">16478</span>&#160;</div><div class="line"><a name="l16479"></a><span class="lineno">16479</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l16480"></a><span class="lineno">16480</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16481"></a><span class="lineno">16481</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l16482"></a><span class="lineno">16482</span>&#160;{</div><div class="line"><a name="l16483"></a><span class="lineno">16483</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16484"></a><span class="lineno">16484</span>&#160;</div><div class="line"><a name="l16485"></a><span class="lineno">16485</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16486"></a><span class="lineno">16486</span>&#160;</div><div class="line"><a name="l16487"></a><span class="lineno">16487</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16488"></a><span class="lineno">16488</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16489"></a><span class="lineno">16489</span>&#160;    {</div><div class="line"><a name="l16490"></a><span class="lineno">16490</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div><div class="line"><a name="l16491"></a><span class="lineno">16491</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16492"></a><span class="lineno">16492</span>&#160;            allocation);</div><div class="line"><a name="l16493"></a><span class="lineno">16493</span>&#160;    }</div><div class="line"><a name="l16494"></a><span class="lineno">16494</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16495"></a><span class="lineno">16495</span>&#160;</div><div class="line"><a name="l16496"></a><span class="lineno">16496</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l16497"></a><span class="lineno">16497</span>&#160;}</div><div class="line"><a name="l16498"></a><span class="lineno">16498</span>&#160;</div><div class="line"><a name="l16499"></a><span class="lineno">16499</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="l16500"></a><span class="lineno">16500</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16501"></a><span class="lineno">16501</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16502"></a><span class="lineno">16502</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l16503"></a><span class="lineno">16503</span>&#160;{</div><div class="line"><a name="l16504"></a><span class="lineno">16504</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16505"></a><span class="lineno">16505</span>&#160;</div><div class="line"><a name="l16506"></a><span class="lineno">16506</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16507"></a><span class="lineno">16507</span>&#160;</div><div class="line"><a name="l16508"></a><span class="lineno">16508</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l16509"></a><span class="lineno">16509</span>&#160;</div><div class="line"><a name="l16510"></a><span class="lineno">16510</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16511"></a><span class="lineno">16511</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16512"></a><span class="lineno">16512</span>&#160;    {</div><div class="line"><a name="l16513"></a><span class="lineno">16513</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div><div class="line"><a name="l16514"></a><span class="lineno">16514</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16515"></a><span class="lineno">16515</span>&#160;            allocation,</div><div class="line"><a name="l16516"></a><span class="lineno">16516</span>&#160;            pUserData);</div><div class="line"><a name="l16517"></a><span class="lineno">16517</span>&#160;    }</div><div class="line"><a name="l16518"></a><span class="lineno">16518</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16519"></a><span class="lineno">16519</span>&#160;}</div><div class="line"><a name="l16520"></a><span class="lineno">16520</span>&#160;</div><div class="line"><a name="l16521"></a><span class="lineno">16521</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="l16522"></a><span class="lineno">16522</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16523"></a><span class="lineno">16523</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l16524"></a><span class="lineno">16524</span>&#160;{</div><div class="line"><a name="l16525"></a><span class="lineno">16525</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l16526"></a><span class="lineno">16526</span>&#160;</div><div class="line"><a name="l16527"></a><span class="lineno">16527</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l16528"></a><span class="lineno">16528</span>&#160;</div><div class="line"><a name="l16529"></a><span class="lineno">16529</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l16530"></a><span class="lineno">16530</span>&#160;</div><div class="line"><a name="l16531"></a><span class="lineno">16531</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16532"></a><span class="lineno">16532</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16533"></a><span class="lineno">16533</span>&#160;    {</div><div class="line"><a name="l16534"></a><span class="lineno">16534</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div><div class="line"><a name="l16535"></a><span class="lineno">16535</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16536"></a><span class="lineno">16536</span>&#160;            *pAllocation);</div><div class="line"><a name="l16537"></a><span class="lineno">16537</span>&#160;    }</div><div class="line"><a name="l16538"></a><span class="lineno">16538</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16539"></a><span class="lineno">16539</span>&#160;}</div><div class="line"><a name="l16540"></a><span class="lineno">16540</span>&#160;</div><div class="line"><a name="l16541"></a><span class="lineno">16541</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l16542"></a><span class="lineno">16542</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16543"></a><span class="lineno">16543</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16544"></a><span class="lineno">16544</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l16545"></a><span class="lineno">16545</span>&#160;{</div><div class="line"><a name="l16546"></a><span class="lineno">16546</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l16547"></a><span class="lineno">16547</span>&#160;</div><div class="line"><a name="l16548"></a><span class="lineno">16548</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16549"></a><span class="lineno">16549</span>&#160;</div><div class="line"><a name="l16550"></a><span class="lineno">16550</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l16551"></a><span class="lineno">16551</span>&#160;</div><div class="line"><a name="l16552"></a><span class="lineno">16552</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16553"></a><span class="lineno">16553</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16554"></a><span class="lineno">16554</span>&#160;    {</div><div class="line"><a name="l16555"></a><span class="lineno">16555</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div><div class="line"><a name="l16556"></a><span class="lineno">16556</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16557"></a><span class="lineno">16557</span>&#160;            allocation);</div><div class="line"><a name="l16558"></a><span class="lineno">16558</span>&#160;    }</div><div class="line"><a name="l16559"></a><span class="lineno">16559</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16560"></a><span class="lineno">16560</span>&#160;</div><div class="line"><a name="l16561"></a><span class="lineno">16561</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16562"></a><span class="lineno">16562</span>&#160;}</div><div class="line"><a name="l16563"></a><span class="lineno">16563</span>&#160;</div><div class="line"><a name="l16564"></a><span class="lineno">16564</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="l16565"></a><span class="lineno">16565</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16566"></a><span class="lineno">16566</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l16567"></a><span class="lineno">16567</span>&#160;{</div><div class="line"><a name="l16568"></a><span class="lineno">16568</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16569"></a><span class="lineno">16569</span>&#160;</div><div class="line"><a name="l16570"></a><span class="lineno">16570</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16571"></a><span class="lineno">16571</span>&#160;</div><div class="line"><a name="l16572"></a><span class="lineno">16572</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16573"></a><span class="lineno">16573</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16574"></a><span class="lineno">16574</span>&#160;    {</div><div class="line"><a name="l16575"></a><span class="lineno">16575</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div><div class="line"><a name="l16576"></a><span class="lineno">16576</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16577"></a><span class="lineno">16577</span>&#160;            allocation);</div><div class="line"><a name="l16578"></a><span class="lineno">16578</span>&#160;    }</div><div class="line"><a name="l16579"></a><span class="lineno">16579</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16580"></a><span class="lineno">16580</span>&#160;</div><div class="line"><a name="l16581"></a><span class="lineno">16581</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l16582"></a><span class="lineno">16582</span>&#160;}</div><div class="line"><a name="l16583"></a><span class="lineno">16583</span>&#160;</div><div class="line"><a name="l16584"></a><span class="lineno">16584</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="l16585"></a><span class="lineno">16585</span>&#160;{</div><div class="line"><a name="l16586"></a><span class="lineno">16586</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16587"></a><span class="lineno">16587</span>&#160;</div><div class="line"><a name="l16588"></a><span class="lineno">16588</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div><div class="line"><a name="l16589"></a><span class="lineno">16589</span>&#160;</div><div class="line"><a name="l16590"></a><span class="lineno">16590</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16591"></a><span class="lineno">16591</span>&#160;</div><div class="line"><a name="l16592"></a><span class="lineno">16592</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div><div class="line"><a name="l16593"></a><span class="lineno">16593</span>&#160;</div><div class="line"><a name="l16594"></a><span class="lineno">16594</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16595"></a><span class="lineno">16595</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16596"></a><span class="lineno">16596</span>&#160;    {</div><div class="line"><a name="l16597"></a><span class="lineno">16597</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div><div class="line"><a name="l16598"></a><span class="lineno">16598</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16599"></a><span class="lineno">16599</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l16600"></a><span class="lineno">16600</span>&#160;    }</div><div class="line"><a name="l16601"></a><span class="lineno">16601</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16602"></a><span class="lineno">16602</span>&#160;}</div><div class="line"><a name="l16603"></a><span class="lineno">16603</span>&#160;</div><div class="line"><a name="l16604"></a><span class="lineno">16604</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="l16605"></a><span class="lineno">16605</span>&#160;{</div><div class="line"><a name="l16606"></a><span class="lineno">16606</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l16607"></a><span class="lineno">16607</span>&#160;</div><div class="line"><a name="l16608"></a><span class="lineno">16608</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div><div class="line"><a name="l16609"></a><span class="lineno">16609</span>&#160;</div><div class="line"><a name="l16610"></a><span class="lineno">16610</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16611"></a><span class="lineno">16611</span>&#160;</div><div class="line"><a name="l16612"></a><span class="lineno">16612</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div><div class="line"><a name="l16613"></a><span class="lineno">16613</span>&#160;</div><div class="line"><a name="l16614"></a><span class="lineno">16614</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16615"></a><span class="lineno">16615</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16616"></a><span class="lineno">16616</span>&#160;    {</div><div class="line"><a name="l16617"></a><span class="lineno">16617</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div><div class="line"><a name="l16618"></a><span class="lineno">16618</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16619"></a><span class="lineno">16619</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l16620"></a><span class="lineno">16620</span>&#160;    }</div><div class="line"><a name="l16621"></a><span class="lineno">16621</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16622"></a><span class="lineno">16622</span>&#160;}</div><div class="line"><a name="l16623"></a><span class="lineno">16623</span>&#160;</div><div class="line"><a name="l16624"></a><span class="lineno">16624</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="l16625"></a><span class="lineno">16625</span>&#160;{</div><div class="line"><a name="l16626"></a><span class="lineno">16626</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16627"></a><span class="lineno">16627</span>&#160;</div><div class="line"><a name="l16628"></a><span class="lineno">16628</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div><div class="line"><a name="l16629"></a><span class="lineno">16629</span>&#160;</div><div class="line"><a name="l16630"></a><span class="lineno">16630</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16631"></a><span class="lineno">16631</span>&#160;</div><div class="line"><a name="l16632"></a><span class="lineno">16632</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div><div class="line"><a name="l16633"></a><span class="lineno">16633</span>&#160;}</div><div class="line"><a name="l16634"></a><span class="lineno">16634</span>&#160;</div><div class="line"><a name="l16635"></a><span class="lineno">16635</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l16636"></a><span class="lineno">16636</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16637"></a><span class="lineno">16637</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l16638"></a><span class="lineno">16638</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l16639"></a><span class="lineno">16639</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l16640"></a><span class="lineno">16640</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="l16641"></a><span class="lineno">16641</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l16642"></a><span class="lineno">16642</span>&#160;{</div><div class="line"><a name="l16643"></a><span class="lineno">16643</span>&#160;    <span class="comment">// Deprecated interface, reimplemented using new one.</span></div><div class="line"><a name="l16644"></a><span class="lineno">16644</span>&#160;</div><div class="line"><a name="l16645"></a><span class="lineno">16645</span>&#160;    <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div><div class="line"><a name="l16646"></a><span class="lineno">16646</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div><div class="line"><a name="l16647"></a><span class="lineno">16647</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = pAllocations;</div><div class="line"><a name="l16648"></a><span class="lineno">16648</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div><div class="line"><a name="l16649"></a><span class="lineno">16649</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l16650"></a><span class="lineno">16650</span>&#160;    {</div><div class="line"><a name="l16651"></a><span class="lineno">16651</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="l16652"></a><span class="lineno">16652</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="l16653"></a><span class="lineno">16653</span>&#160;    }</div><div class="line"><a name="l16654"></a><span class="lineno">16654</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l16655"></a><span class="lineno">16655</span>&#160;    {</div><div class="line"><a name="l16656"></a><span class="lineno">16656</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div><div class="line"><a name="l16657"></a><span class="lineno">16657</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div><div class="line"><a name="l16658"></a><span class="lineno">16658</span>&#160;    }</div><div class="line"><a name="l16659"></a><span class="lineno">16659</span>&#160;    <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div><div class="line"><a name="l16660"></a><span class="lineno">16660</span>&#160;</div><div class="line"><a name="l16661"></a><span class="lineno">16661</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div><div class="line"><a name="l16662"></a><span class="lineno">16662</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="l16663"></a><span class="lineno">16663</span>&#160;    <span class="keywordflow">if</span>(res == VK_NOT_READY)</div><div class="line"><a name="l16664"></a><span class="lineno">16664</span>&#160;    {</div><div class="line"><a name="l16665"></a><span class="lineno">16665</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div><div class="line"><a name="l16666"></a><span class="lineno">16666</span>&#160;    }</div><div class="line"><a name="l16667"></a><span class="lineno">16667</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16668"></a><span class="lineno">16668</span>&#160;}</div><div class="line"><a name="l16669"></a><span class="lineno">16669</span>&#160;</div><div class="line"><a name="l16670"></a><span class="lineno">16670</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div><div class="line"><a name="l16671"></a><span class="lineno">16671</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16672"></a><span class="lineno">16672</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="l16673"></a><span class="lineno">16673</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l16674"></a><span class="lineno">16674</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div><div class="line"><a name="l16675"></a><span class="lineno">16675</span>&#160;{</div><div class="line"><a name="l16676"></a><span class="lineno">16676</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pInfo &amp;&amp; pContext);</div><div class="line"><a name="l16677"></a><span class="lineno">16677</span>&#160;</div><div class="line"><a name="l16678"></a><span class="lineno">16678</span>&#160;    <span class="comment">// Degenerate case: Nothing to defragment.</span></div><div class="line"><a name="l16679"></a><span class="lineno">16679</span>&#160;    <span class="keywordflow">if</span>(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 &amp;&amp; pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div><div class="line"><a name="l16680"></a><span class="lineno">16680</span>&#160;    {</div><div class="line"><a name="l16681"></a><span class="lineno">16681</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l16682"></a><span class="lineno">16682</span>&#160;    }</div><div class="line"><a name="l16683"></a><span class="lineno">16683</span>&#160;</div><div class="line"><a name="l16684"></a><span class="lineno">16684</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> != VMA_NULL);</div><div class="line"><a name="l16685"></a><span class="lineno">16685</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a> != VMA_NULL);</div><div class="line"><a name="l16686"></a><span class="lineno">16686</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>));</div><div class="line"><a name="l16687"></a><span class="lineno">16687</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>));</div><div class="line"><a name="l16688"></a><span class="lineno">16688</span>&#160;</div><div class="line"><a name="l16689"></a><span class="lineno">16689</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationBegin&quot;</span>);</div><div class="line"><a name="l16690"></a><span class="lineno">16690</span>&#160;</div><div class="line"><a name="l16691"></a><span class="lineno">16691</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16692"></a><span class="lineno">16692</span>&#160;</div><div class="line"><a name="l16693"></a><span class="lineno">16693</span>&#160;    VkResult res = allocator-&gt;DefragmentationBegin(*pInfo, pStats, pContext);</div><div class="line"><a name="l16694"></a><span class="lineno">16694</span>&#160;</div><div class="line"><a name="l16695"></a><span class="lineno">16695</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16696"></a><span class="lineno">16696</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16697"></a><span class="lineno">16697</span>&#160;    {</div><div class="line"><a name="l16698"></a><span class="lineno">16698</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDefragmentationBegin(</div><div class="line"><a name="l16699"></a><span class="lineno">16699</span>&#160;            allocator-&gt;GetCurrentFrameIndex(), *pInfo, *pContext);</div><div class="line"><a name="l16700"></a><span class="lineno">16700</span>&#160;    }</div><div class="line"><a name="l16701"></a><span class="lineno">16701</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16702"></a><span class="lineno">16702</span>&#160;</div><div class="line"><a name="l16703"></a><span class="lineno">16703</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16704"></a><span class="lineno">16704</span>&#160;}</div><div class="line"><a name="l16705"></a><span class="lineno">16705</span>&#160;</div><div class="line"><a name="l16706"></a><span class="lineno">16706</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div><div class="line"><a name="l16707"></a><span class="lineno">16707</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16708"></a><span class="lineno">16708</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div><div class="line"><a name="l16709"></a><span class="lineno">16709</span>&#160;{</div><div class="line"><a name="l16710"></a><span class="lineno">16710</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16711"></a><span class="lineno">16711</span>&#160;</div><div class="line"><a name="l16712"></a><span class="lineno">16712</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationEnd&quot;</span>);</div><div class="line"><a name="l16713"></a><span class="lineno">16713</span>&#160;</div><div class="line"><a name="l16714"></a><span class="lineno">16714</span>&#160;    <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div><div class="line"><a name="l16715"></a><span class="lineno">16715</span>&#160;    {</div><div class="line"><a name="l16716"></a><span class="lineno">16716</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16717"></a><span class="lineno">16717</span>&#160;</div><div class="line"><a name="l16718"></a><span class="lineno">16718</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16719"></a><span class="lineno">16719</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16720"></a><span class="lineno">16720</span>&#160;        {</div><div class="line"><a name="l16721"></a><span class="lineno">16721</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordDefragmentationEnd(</div><div class="line"><a name="l16722"></a><span class="lineno">16722</span>&#160;                allocator-&gt;GetCurrentFrameIndex(), context);</div><div class="line"><a name="l16723"></a><span class="lineno">16723</span>&#160;        }</div><div class="line"><a name="l16724"></a><span class="lineno">16724</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16725"></a><span class="lineno">16725</span>&#160;</div><div class="line"><a name="l16726"></a><span class="lineno">16726</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;DefragmentationEnd(context);</div><div class="line"><a name="l16727"></a><span class="lineno">16727</span>&#160;    }</div><div class="line"><a name="l16728"></a><span class="lineno">16728</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l16729"></a><span class="lineno">16729</span>&#160;    {</div><div class="line"><a name="l16730"></a><span class="lineno">16730</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l16731"></a><span class="lineno">16731</span>&#160;    }</div><div class="line"><a name="l16732"></a><span class="lineno">16732</span>&#160;}</div><div class="line"><a name="l16733"></a><span class="lineno">16733</span>&#160;</div><div class="line"><a name="l16734"></a><span class="lineno">16734</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l16735"></a><span class="lineno">16735</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16736"></a><span class="lineno">16736</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16737"></a><span class="lineno">16737</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l16738"></a><span class="lineno">16738</span>&#160;{</div><div class="line"><a name="l16739"></a><span class="lineno">16739</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l16740"></a><span class="lineno">16740</span>&#160;</div><div class="line"><a name="l16741"></a><span class="lineno">16741</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l16742"></a><span class="lineno">16742</span>&#160;</div><div class="line"><a name="l16743"></a><span class="lineno">16743</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16744"></a><span class="lineno">16744</span>&#160;</div><div class="line"><a name="l16745"></a><span class="lineno">16745</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div><div class="line"><a name="l16746"></a><span class="lineno">16746</span>&#160;}</div><div class="line"><a name="l16747"></a><span class="lineno">16747</span>&#160;</div><div class="line"><a name="l16748"></a><span class="lineno">16748</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div><div class="line"><a name="l16749"></a><span class="lineno">16749</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16750"></a><span class="lineno">16750</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16751"></a><span class="lineno">16751</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l16752"></a><span class="lineno">16752</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l16753"></a><span class="lineno">16753</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l16754"></a><span class="lineno">16754</span>&#160;{</div><div class="line"><a name="l16755"></a><span class="lineno">16755</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l16756"></a><span class="lineno">16756</span>&#160;</div><div class="line"><a name="l16757"></a><span class="lineno">16757</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory2&quot;</span>);</div><div class="line"><a name="l16758"></a><span class="lineno">16758</span>&#160;</div><div class="line"><a name="l16759"></a><span class="lineno">16759</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16760"></a><span class="lineno">16760</span>&#160;</div><div class="line"><a name="l16761"></a><span class="lineno">16761</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div><div class="line"><a name="l16762"></a><span class="lineno">16762</span>&#160;}</div><div class="line"><a name="l16763"></a><span class="lineno">16763</span>&#160;</div><div class="line"><a name="l16764"></a><span class="lineno">16764</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l16765"></a><span class="lineno">16765</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16766"></a><span class="lineno">16766</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16767"></a><span class="lineno">16767</span>&#160;    VkImage image)</div><div class="line"><a name="l16768"></a><span class="lineno">16768</span>&#160;{</div><div class="line"><a name="l16769"></a><span class="lineno">16769</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l16770"></a><span class="lineno">16770</span>&#160;</div><div class="line"><a name="l16771"></a><span class="lineno">16771</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l16772"></a><span class="lineno">16772</span>&#160;</div><div class="line"><a name="l16773"></a><span class="lineno">16773</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16774"></a><span class="lineno">16774</span>&#160;</div><div class="line"><a name="l16775"></a><span class="lineno">16775</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, 0, image, VMA_NULL);</div><div class="line"><a name="l16776"></a><span class="lineno">16776</span>&#160;}</div><div class="line"><a name="l16777"></a><span class="lineno">16777</span>&#160;</div><div class="line"><a name="l16778"></a><span class="lineno">16778</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div><div class="line"><a name="l16779"></a><span class="lineno">16779</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16780"></a><span class="lineno">16780</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l16781"></a><span class="lineno">16781</span>&#160;    VkDeviceSize allocationLocalOffset,</div><div class="line"><a name="l16782"></a><span class="lineno">16782</span>&#160;    VkImage image,</div><div class="line"><a name="l16783"></a><span class="lineno">16783</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div><div class="line"><a name="l16784"></a><span class="lineno">16784</span>&#160;{</div><div class="line"><a name="l16785"></a><span class="lineno">16785</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l16786"></a><span class="lineno">16786</span>&#160;</div><div class="line"><a name="l16787"></a><span class="lineno">16787</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory2&quot;</span>);</div><div class="line"><a name="l16788"></a><span class="lineno">16788</span>&#160;</div><div class="line"><a name="l16789"></a><span class="lineno">16789</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16790"></a><span class="lineno">16790</span>&#160;</div><div class="line"><a name="l16791"></a><span class="lineno">16791</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div><div class="line"><a name="l16792"></a><span class="lineno">16792</span>&#160;}</div><div class="line"><a name="l16793"></a><span class="lineno">16793</span>&#160;</div><div class="line"><a name="l16794"></a><span class="lineno">16794</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l16795"></a><span class="lineno">16795</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16796"></a><span class="lineno">16796</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l16797"></a><span class="lineno">16797</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="l16798"></a><span class="lineno">16798</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l16799"></a><span class="lineno">16799</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l16800"></a><span class="lineno">16800</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16801"></a><span class="lineno">16801</span>&#160;{</div><div class="line"><a name="l16802"></a><span class="lineno">16802</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l16803"></a><span class="lineno">16803</span>&#160;</div><div class="line"><a name="l16804"></a><span class="lineno">16804</span>&#160;    <span class="keywordflow">if</span>(pBufferCreateInfo-&gt;size == 0)</div><div class="line"><a name="l16805"></a><span class="lineno">16805</span>&#160;    {</div><div class="line"><a name="l16806"></a><span class="lineno">16806</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l16807"></a><span class="lineno">16807</span>&#160;    }</div><div class="line"><a name="l16808"></a><span class="lineno">16808</span>&#160;    </div><div class="line"><a name="l16809"></a><span class="lineno">16809</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l16810"></a><span class="lineno">16810</span>&#160;    </div><div class="line"><a name="l16811"></a><span class="lineno">16811</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16812"></a><span class="lineno">16812</span>&#160;</div><div class="line"><a name="l16813"></a><span class="lineno">16813</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l16814"></a><span class="lineno">16814</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l16815"></a><span class="lineno">16815</span>&#160;</div><div class="line"><a name="l16816"></a><span class="lineno">16816</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l16817"></a><span class="lineno">16817</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l16818"></a><span class="lineno">16818</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l16819"></a><span class="lineno">16819</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l16820"></a><span class="lineno">16820</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l16821"></a><span class="lineno">16821</span>&#160;        pBuffer);</div><div class="line"><a name="l16822"></a><span class="lineno">16822</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l16823"></a><span class="lineno">16823</span>&#160;    {</div><div class="line"><a name="l16824"></a><span class="lineno">16824</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l16825"></a><span class="lineno">16825</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l16826"></a><span class="lineno">16826</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l16827"></a><span class="lineno">16827</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l16828"></a><span class="lineno">16828</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l16829"></a><span class="lineno">16829</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l16830"></a><span class="lineno">16830</span>&#160;</div><div class="line"><a name="l16831"></a><span class="lineno">16831</span>&#160;        <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l16832"></a><span class="lineno">16832</span>&#160;        <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l16833"></a><span class="lineno">16833</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="l16834"></a><span class="lineno">16834</span>&#160;        {</div><div class="line"><a name="l16835"></a><span class="lineno">16835</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l16836"></a><span class="lineno">16836</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l16837"></a><span class="lineno">16837</span>&#160;        }</div><div class="line"><a name="l16838"></a><span class="lineno">16838</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l16839"></a><span class="lineno">16839</span>&#160;        {</div><div class="line"><a name="l16840"></a><span class="lineno">16840</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l16841"></a><span class="lineno">16841</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l16842"></a><span class="lineno">16842</span>&#160;        }</div><div class="line"><a name="l16843"></a><span class="lineno">16843</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l16844"></a><span class="lineno">16844</span>&#160;        {</div><div class="line"><a name="l16845"></a><span class="lineno">16845</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l16846"></a><span class="lineno">16846</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l16847"></a><span class="lineno">16847</span>&#160;        }</div><div class="line"><a name="l16848"></a><span class="lineno">16848</span>&#160;</div><div class="line"><a name="l16849"></a><span class="lineno">16849</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l16850"></a><span class="lineno">16850</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16851"></a><span class="lineno">16851</span>&#160;            vkMemReq,</div><div class="line"><a name="l16852"></a><span class="lineno">16852</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l16853"></a><span class="lineno">16853</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l16854"></a><span class="lineno">16854</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16855"></a><span class="lineno">16855</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16856"></a><span class="lineno">16856</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l16857"></a><span class="lineno">16857</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l16858"></a><span class="lineno">16858</span>&#160;            1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16859"></a><span class="lineno">16859</span>&#160;            pAllocation);</div><div class="line"><a name="l16860"></a><span class="lineno">16860</span>&#160;</div><div class="line"><a name="l16861"></a><span class="lineno">16861</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16862"></a><span class="lineno">16862</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16863"></a><span class="lineno">16863</span>&#160;        {</div><div class="line"><a name="l16864"></a><span class="lineno">16864</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div><div class="line"><a name="l16865"></a><span class="lineno">16865</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16866"></a><span class="lineno">16866</span>&#160;                *pBufferCreateInfo,</div><div class="line"><a name="l16867"></a><span class="lineno">16867</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l16868"></a><span class="lineno">16868</span>&#160;                *pAllocation);</div><div class="line"><a name="l16869"></a><span class="lineno">16869</span>&#160;        }</div><div class="line"><a name="l16870"></a><span class="lineno">16870</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16871"></a><span class="lineno">16871</span>&#160;</div><div class="line"><a name="l16872"></a><span class="lineno">16872</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l16873"></a><span class="lineno">16873</span>&#160;        {</div><div class="line"><a name="l16874"></a><span class="lineno">16874</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l16875"></a><span class="lineno">16875</span>&#160;            <span class="keywordflow">if</span>((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#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div><div class="line"><a name="l16876"></a><span class="lineno">16876</span>&#160;            {</div><div class="line"><a name="l16877"></a><span class="lineno">16877</span>&#160;                res = allocator-&gt;BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div><div class="line"><a name="l16878"></a><span class="lineno">16878</span>&#160;            }</div><div class="line"><a name="l16879"></a><span class="lineno">16879</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l16880"></a><span class="lineno">16880</span>&#160;            {</div><div class="line"><a name="l16881"></a><span class="lineno">16881</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l16882"></a><span class="lineno">16882</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l16883"></a><span class="lineno">16883</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div><div class="line"><a name="l16884"></a><span class="lineno">16884</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l16885"></a><span class="lineno">16885</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l16886"></a><span class="lineno">16886</span>&#160;                {</div><div class="line"><a name="l16887"></a><span class="lineno">16887</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l16888"></a><span class="lineno">16888</span>&#160;                }</div><div class="line"><a name="l16889"></a><span class="lineno">16889</span>&#160;</div><div class="line"><a name="l16890"></a><span class="lineno">16890</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l16891"></a><span class="lineno">16891</span>&#160;            }</div><div class="line"><a name="l16892"></a><span class="lineno">16892</span>&#160;            allocator-&gt;FreeMemory(</div><div class="line"><a name="l16893"></a><span class="lineno">16893</span>&#160;                1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16894"></a><span class="lineno">16894</span>&#160;                pAllocation);</div><div class="line"><a name="l16895"></a><span class="lineno">16895</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l16896"></a><span class="lineno">16896</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l16897"></a><span class="lineno">16897</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l16898"></a><span class="lineno">16898</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16899"></a><span class="lineno">16899</span>&#160;        }</div><div class="line"><a name="l16900"></a><span class="lineno">16900</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l16901"></a><span class="lineno">16901</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l16902"></a><span class="lineno">16902</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16903"></a><span class="lineno">16903</span>&#160;    }</div><div class="line"><a name="l16904"></a><span class="lineno">16904</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l16905"></a><span class="lineno">16905</span>&#160;}</div><div class="line"><a name="l16906"></a><span class="lineno">16906</span>&#160;</div><div class="line"><a name="l16907"></a><span class="lineno">16907</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="l16908"></a><span class="lineno">16908</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16909"></a><span class="lineno">16909</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l16910"></a><span class="lineno">16910</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l16911"></a><span class="lineno">16911</span>&#160;{</div><div class="line"><a name="l16912"></a><span class="lineno">16912</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l16913"></a><span class="lineno">16913</span>&#160;</div><div class="line"><a name="l16914"></a><span class="lineno">16914</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l16915"></a><span class="lineno">16915</span>&#160;    {</div><div class="line"><a name="l16916"></a><span class="lineno">16916</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l16917"></a><span class="lineno">16917</span>&#160;    }</div><div class="line"><a name="l16918"></a><span class="lineno">16918</span>&#160;</div><div class="line"><a name="l16919"></a><span class="lineno">16919</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l16920"></a><span class="lineno">16920</span>&#160;</div><div class="line"><a name="l16921"></a><span class="lineno">16921</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16922"></a><span class="lineno">16922</span>&#160;</div><div class="line"><a name="l16923"></a><span class="lineno">16923</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l16924"></a><span class="lineno">16924</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l16925"></a><span class="lineno">16925</span>&#160;    {</div><div class="line"><a name="l16926"></a><span class="lineno">16926</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div><div class="line"><a name="l16927"></a><span class="lineno">16927</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l16928"></a><span class="lineno">16928</span>&#160;            allocation);</div><div class="line"><a name="l16929"></a><span class="lineno">16929</span>&#160;    }</div><div class="line"><a name="l16930"></a><span class="lineno">16930</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l16931"></a><span class="lineno">16931</span>&#160;</div><div class="line"><a name="l16932"></a><span class="lineno">16932</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l16933"></a><span class="lineno">16933</span>&#160;    {</div><div class="line"><a name="l16934"></a><span class="lineno">16934</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l16935"></a><span class="lineno">16935</span>&#160;    }</div><div class="line"><a name="l16936"></a><span class="lineno">16936</span>&#160;</div><div class="line"><a name="l16937"></a><span class="lineno">16937</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l16938"></a><span class="lineno">16938</span>&#160;    {</div><div class="line"><a name="l16939"></a><span class="lineno">16939</span>&#160;        allocator-&gt;FreeMemory(</div><div class="line"><a name="l16940"></a><span class="lineno">16940</span>&#160;            1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16941"></a><span class="lineno">16941</span>&#160;            &amp;allocation);</div><div class="line"><a name="l16942"></a><span class="lineno">16942</span>&#160;    }</div><div class="line"><a name="l16943"></a><span class="lineno">16943</span>&#160;}</div><div class="line"><a name="l16944"></a><span class="lineno">16944</span>&#160;</div><div class="line"><a name="l16945"></a><span class="lineno">16945</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l16946"></a><span class="lineno">16946</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l16947"></a><span class="lineno">16947</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l16948"></a><span class="lineno">16948</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="l16949"></a><span class="lineno">16949</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l16950"></a><span class="lineno">16950</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l16951"></a><span class="lineno">16951</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l16952"></a><span class="lineno">16952</span>&#160;{</div><div class="line"><a name="l16953"></a><span class="lineno">16953</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l16954"></a><span class="lineno">16954</span>&#160;</div><div class="line"><a name="l16955"></a><span class="lineno">16955</span>&#160;    <span class="keywordflow">if</span>(pImageCreateInfo-&gt;extent.width == 0 ||</div><div class="line"><a name="l16956"></a><span class="lineno">16956</span>&#160;        pImageCreateInfo-&gt;extent.height == 0 ||</div><div class="line"><a name="l16957"></a><span class="lineno">16957</span>&#160;        pImageCreateInfo-&gt;extent.depth == 0 ||</div><div class="line"><a name="l16958"></a><span class="lineno">16958</span>&#160;        pImageCreateInfo-&gt;mipLevels == 0 ||</div><div class="line"><a name="l16959"></a><span class="lineno">16959</span>&#160;        pImageCreateInfo-&gt;arrayLayers == 0)</div><div class="line"><a name="l16960"></a><span class="lineno">16960</span>&#160;    {</div><div class="line"><a name="l16961"></a><span class="lineno">16961</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l16962"></a><span class="lineno">16962</span>&#160;    }</div><div class="line"><a name="l16963"></a><span class="lineno">16963</span>&#160;</div><div class="line"><a name="l16964"></a><span class="lineno">16964</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l16965"></a><span class="lineno">16965</span>&#160;</div><div class="line"><a name="l16966"></a><span class="lineno">16966</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l16967"></a><span class="lineno">16967</span>&#160;</div><div class="line"><a name="l16968"></a><span class="lineno">16968</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l16969"></a><span class="lineno">16969</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l16970"></a><span class="lineno">16970</span>&#160;</div><div class="line"><a name="l16971"></a><span class="lineno">16971</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l16972"></a><span class="lineno">16972</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l16973"></a><span class="lineno">16973</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l16974"></a><span class="lineno">16974</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l16975"></a><span class="lineno">16975</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l16976"></a><span class="lineno">16976</span>&#160;        pImage);</div><div class="line"><a name="l16977"></a><span class="lineno">16977</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l16978"></a><span class="lineno">16978</span>&#160;    {</div><div class="line"><a name="l16979"></a><span class="lineno">16979</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l16980"></a><span class="lineno">16980</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l16981"></a><span class="lineno">16981</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l16982"></a><span class="lineno">16982</span>&#160;        </div><div class="line"><a name="l16983"></a><span class="lineno">16983</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l16984"></a><span class="lineno">16984</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l16985"></a><span class="lineno">16985</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l16986"></a><span class="lineno">16986</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l16987"></a><span class="lineno">16987</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div><div class="line"><a name="l16988"></a><span class="lineno">16988</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l16989"></a><span class="lineno">16989</span>&#160;</div><div class="line"><a name="l16990"></a><span class="lineno">16990</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l16991"></a><span class="lineno">16991</span>&#160;            vkMemReq,</div><div class="line"><a name="l16992"></a><span class="lineno">16992</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l16993"></a><span class="lineno">16993</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l16994"></a><span class="lineno">16994</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l16995"></a><span class="lineno">16995</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l16996"></a><span class="lineno">16996</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l16997"></a><span class="lineno">16997</span>&#160;            suballocType,</div><div class="line"><a name="l16998"></a><span class="lineno">16998</span>&#160;            1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l16999"></a><span class="lineno">16999</span>&#160;            pAllocation);</div><div class="line"><a name="l17000"></a><span class="lineno">17000</span>&#160;</div><div class="line"><a name="l17001"></a><span class="lineno">17001</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l17002"></a><span class="lineno">17002</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l17003"></a><span class="lineno">17003</span>&#160;        {</div><div class="line"><a name="l17004"></a><span class="lineno">17004</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div><div class="line"><a name="l17005"></a><span class="lineno">17005</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l17006"></a><span class="lineno">17006</span>&#160;                *pImageCreateInfo,</div><div class="line"><a name="l17007"></a><span class="lineno">17007</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l17008"></a><span class="lineno">17008</span>&#160;                *pAllocation);</div><div class="line"><a name="l17009"></a><span class="lineno">17009</span>&#160;        }</div><div class="line"><a name="l17010"></a><span class="lineno">17010</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l17011"></a><span class="lineno">17011</span>&#160;</div><div class="line"><a name="l17012"></a><span class="lineno">17012</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l17013"></a><span class="lineno">17013</span>&#160;        {</div><div class="line"><a name="l17014"></a><span class="lineno">17014</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l17015"></a><span class="lineno">17015</span>&#160;            <span class="keywordflow">if</span>((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#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div><div class="line"><a name="l17016"></a><span class="lineno">17016</span>&#160;            {</div><div class="line"><a name="l17017"></a><span class="lineno">17017</span>&#160;                res = allocator-&gt;BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div><div class="line"><a name="l17018"></a><span class="lineno">17018</span>&#160;            }</div><div class="line"><a name="l17019"></a><span class="lineno">17019</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l17020"></a><span class="lineno">17020</span>&#160;            {</div><div class="line"><a name="l17021"></a><span class="lineno">17021</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l17022"></a><span class="lineno">17022</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l17023"></a><span class="lineno">17023</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div><div class="line"><a name="l17024"></a><span class="lineno">17024</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l17025"></a><span class="lineno">17025</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l17026"></a><span class="lineno">17026</span>&#160;                {</div><div class="line"><a name="l17027"></a><span class="lineno">17027</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l17028"></a><span class="lineno">17028</span>&#160;                }</div><div class="line"><a name="l17029"></a><span class="lineno">17029</span>&#160;</div><div class="line"><a name="l17030"></a><span class="lineno">17030</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l17031"></a><span class="lineno">17031</span>&#160;            }</div><div class="line"><a name="l17032"></a><span class="lineno">17032</span>&#160;            allocator-&gt;FreeMemory(</div><div class="line"><a name="l17033"></a><span class="lineno">17033</span>&#160;                1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l17034"></a><span class="lineno">17034</span>&#160;                pAllocation);</div><div class="line"><a name="l17035"></a><span class="lineno">17035</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l17036"></a><span class="lineno">17036</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l17037"></a><span class="lineno">17037</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l17038"></a><span class="lineno">17038</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l17039"></a><span class="lineno">17039</span>&#160;        }</div><div class="line"><a name="l17040"></a><span class="lineno">17040</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l17041"></a><span class="lineno">17041</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l17042"></a><span class="lineno">17042</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l17043"></a><span class="lineno">17043</span>&#160;    }</div><div class="line"><a name="l17044"></a><span class="lineno">17044</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l17045"></a><span class="lineno">17045</span>&#160;}</div><div class="line"><a name="l17046"></a><span class="lineno">17046</span>&#160;</div><div class="line"><a name="l17047"></a><span class="lineno">17047</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="l17048"></a><span class="lineno">17048</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l17049"></a><span class="lineno">17049</span>&#160;    VkImage image,</div><div class="line"><a name="l17050"></a><span class="lineno">17050</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l17051"></a><span class="lineno">17051</span>&#160;{</div><div class="line"><a name="l17052"></a><span class="lineno">17052</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l17053"></a><span class="lineno">17053</span>&#160;</div><div class="line"><a name="l17054"></a><span class="lineno">17054</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l17055"></a><span class="lineno">17055</span>&#160;    {</div><div class="line"><a name="l17056"></a><span class="lineno">17056</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l17057"></a><span class="lineno">17057</span>&#160;    }</div><div class="line"><a name="l17058"></a><span class="lineno">17058</span>&#160;</div><div class="line"><a name="l17059"></a><span class="lineno">17059</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l17060"></a><span class="lineno">17060</span>&#160;</div><div class="line"><a name="l17061"></a><span class="lineno">17061</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l17062"></a><span class="lineno">17062</span>&#160;</div><div class="line"><a name="l17063"></a><span class="lineno">17063</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l17064"></a><span class="lineno">17064</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l17065"></a><span class="lineno">17065</span>&#160;    {</div><div class="line"><a name="l17066"></a><span class="lineno">17066</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div><div class="line"><a name="l17067"></a><span class="lineno">17067</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l17068"></a><span class="lineno">17068</span>&#160;            allocation);</div><div class="line"><a name="l17069"></a><span class="lineno">17069</span>&#160;    }</div><div class="line"><a name="l17070"></a><span class="lineno">17070</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l17071"></a><span class="lineno">17071</span>&#160;</div><div class="line"><a name="l17072"></a><span class="lineno">17072</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l17073"></a><span class="lineno">17073</span>&#160;    {</div><div class="line"><a name="l17074"></a><span class="lineno">17074</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l17075"></a><span class="lineno">17075</span>&#160;    }</div><div class="line"><a name="l17076"></a><span class="lineno">17076</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l17077"></a><span class="lineno">17077</span>&#160;    {</div><div class="line"><a name="l17078"></a><span class="lineno">17078</span>&#160;        allocator-&gt;FreeMemory(</div><div class="line"><a name="l17079"></a><span class="lineno">17079</span>&#160;            1, <span class="comment">// allocationCount</span></div><div class="line"><a name="l17080"></a><span class="lineno">17080</span>&#160;            &amp;allocation);</div><div class="line"><a name="l17081"></a><span class="lineno">17081</span>&#160;    }</div><div class="line"><a name="l17082"></a><span class="lineno">17082</span>&#160;}</div><div class="line"><a name="l17083"></a><span class="lineno">17083</span>&#160;</div><div class="line"><a name="l17084"></a><span class="lineno">17084</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:1810</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:2114</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:1872</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:2911</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="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:1846</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:2445</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:1822</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:2076</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:2180</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">Reserved for future use. Should be 0.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2864</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:1814</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:2545</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:1869</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:2947</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa8251ee81b0045a443e35b8e8aa021bc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a></div><div class="ttdeci">VkResult vmaBindImageMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</div><div class="ttdoc">Binds image to allocation with additional parameters.</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:2334</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:1690</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:2426</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:2151</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2867</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:1803</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:2233</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:2103</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:1881</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:2362</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:1935</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:1866</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:2107</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:2007</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:1819</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info2_html_a0b3effd57f3fcdeb2ed62210b4ef20e1"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">VmaDefragmentationInfo2::pPools</a></div><div class="ttdeci">VmaPool * pPools</div><div class="ttdoc">Either null or pointer to array of pools to be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2901</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:2006</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:2951</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(),...</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:1898</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:2016</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:2959</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:2217</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2175</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:2942</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:1820</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:1733</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:1875</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ab9e709de044c5d8476bea77a4e755840"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</a></div><div class="ttdeci">void vmaFreeMemoryPages(VmaAllocator allocator, size_t allocationCount, VmaAllocation *pAllocations)</div><div class="ttdoc">Frees memory and destroys multiple allocations.</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:2376</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:2370</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_ae5c0db8c89a3b82593dc16aa6a49fa3a"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">VmaVulkanFunctions::vkCmdCopyBuffer</a></div><div class="ttdeci">PFN_vkCmdCopyBuffer vkCmdCopyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1826</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:1942</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:2555</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:1815</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:1844</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:2254</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:2396</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:2432</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:1801</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:2379</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="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:2916</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:2054</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:2876</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">Deprecated. Optional configuration parameters to be passed to function vmaDefragment().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2937</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:2955</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:2093</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:2241</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:1818</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">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:2012</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:1739</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:2855</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_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:2853</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:2201</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:2882</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:1760</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:1848</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:1765</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:2957</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:2228</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:2442</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:1811</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:1995</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2391</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:1752</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:2366</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:2158</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:2008</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1799</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:1756</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:2191</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:2382</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:2102</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:1817</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:2223</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:2214</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:1998</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:1813</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:2404</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:1884</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:2435</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:2212</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:2906</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:2247</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:1923</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:2014</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:2138</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:2007</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:1824</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:1854</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(). None at the moment. Reserved for future use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2852</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2930</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:1754</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:1823</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:2418</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:1816</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:2169</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:1862</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:2569</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:1878</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:2007</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad37e82e492b3de38fc3f4cffd9ad0ae1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a></div><div class="ttdeci">VkResult vmaAllocateMemoryPages(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, size_t allocationCount, VmaAllocation *pAllocations, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation for multiple allocation objects at once.</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:2004</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:2423</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:2861</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:2184</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,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2550</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:2198</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:2210</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:2953</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:1809</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="vk__mem__alloc_8h_html_a927c944f45e0f2941182abb6f608e64a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a></div><div class="ttdeci">VkResult vmaBindBufferMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</div><div class="ttdoc">Binds buffer to allocation with additional parameters.</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:2002</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:2059</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:2372</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:1851</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:2000</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:1821</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:1825</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:2125</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:2205</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:2086</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:2564</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:1787</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:1812</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:2351</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">Deprecated.</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:2531</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:2195</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:2316</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:2008</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:2164</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:1838</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:2015</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:2429</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:2008</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:2921</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:2536</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info2_html_a7e70aa2a1081d849dcc7829b19d3ec9d"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">VmaDefragmentationInfo2::poolCount</a></div><div class="ttdeci">uint32_t poolCount</div><div class="ttdoc">Numer of pools in pPools array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2885</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-2019 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="l01760"></a><span class="lineno"> 1760</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l01761"></a><span class="lineno"> 1761</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="l01762"></a><span class="lineno"> 1762</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div>
+<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l01765"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1765</a></span>&#160;<span class="preprocessor">    #define VMA_RECORDING_ENABLED 0</span></div>
+<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; </div>
+<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;<span class="preprocessor">#ifndef NOMINMAX</span></div>
+<div class="line"><a name="l01769"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90"> 1769</a></span>&#160;<span class="preprocessor">    #define NOMINMAX // For windows.h</span></div>
+<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; </div>
+<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;<span class="preprocessor">#ifndef VULKAN_H_</span></div>
+<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;<span class="preprocessor">    #include &lt;vulkan/vulkan.h&gt;</span></div>
+<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160; </div>
+<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;<span class="preprocessor">    #include &lt;windows.h&gt;</span></div>
+<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160; </div>
+<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div>
+<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div>
+<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div>
+<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l01784"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1784</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div>
+<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; </div>
+<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;<span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div>
+<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;<span class="preprocessor">    #if VK_KHR_bind_memory2</span></div>
+<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 1</span></div>
+<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l01792"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 1792</a></span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 0</span></div>
+<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;<span class="preprocessor">#endif</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 !defined(VMA_MEMORY_BUDGET)</span></div>
+<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;<span class="preprocessor">    #if VK_EXT_memory_budget &amp;&amp; VK_KHR_get_physical_device_properties2</span></div>
+<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 1</span></div>
+<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l01800"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a"> 1800</a></span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 0</span></div>
+<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; </div>
+<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;<span class="comment">// Define these macros to decorate all public functions with additional code,</span></div>
+<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;<span class="comment">// before and after returned type, appropriately. This may be useful for</span></div>
+<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;<span class="comment">// exporing the functions when compiling VMA as a separate library. Example:</span></div>
+<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;<span class="comment">// #define VMA_CALL_PRE  __declspec(dllexport)</span></div>
+<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;<span class="comment">// #define VMA_CALL_POST __cdecl</span></div>
+<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_PRE</span></div>
+<div class="line"><a name="l01810"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31"> 1810</a></span>&#160;<span class="preprocessor">    #define VMA_CALL_PRE</span></div>
+<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_POST</span></div>
+<div class="line"><a name="l01813"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0"> 1813</a></span>&#160;<span class="preprocessor">    #define VMA_CALL_POST</span></div>
+<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; </div>
+<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div>
+<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; </div>
+<div class="line"><a name="l01827"></a><span class="lineno"> 1827</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="l01829"></a><span class="lineno"> 1829</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div>
+<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;    uint32_t          memoryType,</div>
+<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;    VkDeviceMemory    memory,</div>
+<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;    VkDeviceSize      size);</div>
+<div class="line"><a name="l01834"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1834</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="l01835"></a><span class="lineno"> 1835</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div>
+<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;    uint32_t          memoryType,</div>
+<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;    VkDeviceMemory    memory,</div>
+<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;    VkDeviceSize      size);</div>
+<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; </div>
+<div class="line"><a name="l01847"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1847</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="l01849"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1849</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="l01851"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1851</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="l01852"></a><span class="lineno"> 1852</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div>
+<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160; </div>
+<div class="line"><a name="l01855"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1855</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="l01860"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1860</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="l01882"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1882</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="l01894"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 1894</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div>
+<div class="line"><a name="l01906"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"> 1906</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008,</div>
+<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160; </div>
+<div class="line"><a name="l01908"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1908</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="l01909"></a><span class="lineno"> 1909</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div>
+<div class="line"><a name="l01910"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1910</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="l01911"></a><span class="lineno"> 1911</span>&#160; </div>
+<div class="line"><a name="l01916"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1916</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="l01917"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1917</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div>
+<div class="line"><a name="l01918"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1918</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div>
+<div class="line"><a name="l01919"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1919</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div>
+<div class="line"><a name="l01920"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1920</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div>
+<div class="line"><a name="l01921"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1921</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div>
+<div class="line"><a name="l01922"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1922</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div>
+<div class="line"><a name="l01923"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1923</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div>
+<div class="line"><a name="l01924"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1924</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div>
+<div class="line"><a name="l01925"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1925</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div>
+<div class="line"><a name="l01926"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1926</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div>
+<div class="line"><a name="l01927"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1927</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div>
+<div class="line"><a name="l01928"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1928</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div>
+<div class="line"><a name="l01929"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1929</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div>
+<div class="line"><a name="l01930"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1930</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div>
+<div class="line"><a name="l01931"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1931</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div>
+<div class="line"><a name="l01932"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1932</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div>
+<div class="line"><a name="l01933"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 1933</a></span>&#160;    PFN_vkCmdCopyBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div>
+<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div>
+<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div>
+<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;    PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;</div>
+<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;    PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;</div>
+<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;</div>
+<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div>
+<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; </div>
+<div class="line"><a name="l01948"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 1948</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="l01954"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 1954</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="l01955"></a><span class="lineno"> 1955</span>&#160;    </div>
+<div class="line"><a name="l01956"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 1956</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="l01957"></a><span class="lineno"> 1957</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div>
+<div class="line"><a name="l01958"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 1958</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="l01959"></a><span class="lineno"> 1959</span>&#160; </div>
+<div class="line"><a name="l01961"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 1961</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="l01962"></a><span class="lineno"> 1962</span>&#160;{</div>
+<div class="line"><a name="l01964"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 1964</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="l01972"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 1972</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="l01973"></a><span class="lineno"> 1973</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a>;</div>
+<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160; </div>
+<div class="line"><a name="l01976"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1976</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="l01977"></a><span class="lineno"> 1977</span>&#160;{</div>
+<div class="line"><a name="l01979"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1979</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="l01981"></a><span class="lineno"> 1981</span>&#160; </div>
+<div class="line"><a name="l01982"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1982</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div>
+<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160; </div>
+<div class="line"><a name="l01985"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1985</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div>
+<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160; </div>
+<div class="line"><a name="l01988"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1988</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div>
+<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160; </div>
+<div class="line"><a name="l01991"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1991</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="l01993"></a><span class="lineno"> 1993</span>&#160; </div>
+<div class="line"><a name="l01994"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1994</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="l02008"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 2008</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div>
+<div class="line"><a name="l02033"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 2033</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="l02045"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 2045</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="l02052"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 2052</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="l02057"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b"> 2057</a></span>&#160;    VkInstance <a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>;</div>
+<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</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"> 2061</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a>(</div>
+<div class="line"><a name="l02062"></a><span class="lineno"> 2062</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="l02063"></a><span class="lineno"> 2063</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div>
+<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160; </div>
+<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a>(</div>
+<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div>
+<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160; </div>
+<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vmaGetPhysicalDeviceProperties</a>(</div>
+<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div>
+<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160; </div>
+<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties</a>(</div>
+<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160; </div>
+<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a>(</div>
+<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;    VkMemoryPropertyFlags* pFlags);</div>
+<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160; </div>
+<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vmaSetCurrentFrameIndex</a>(</div>
+<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;    uint32_t frameIndex);</div>
+<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160; </div>
+<div class="line"><a name="l02110"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 2110</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="l02111"></a><span class="lineno"> 2111</span>&#160;{</div>
+<div class="line"><a name="l02113"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 2113</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div>
+<div class="line"><a name="l02115"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2115</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
+<div class="line"><a name="l02117"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2117</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l02119"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2119</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
+<div class="line"><a name="l02121"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2121</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
+<div class="line"><a name="l02122"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 2122</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="l02123"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 2123</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="l02124"></a><span class="lineno"> 2124</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div>
+<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160; </div>
+<div class="line"><a name="l02127"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2127</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="l02128"></a><span class="lineno"> 2128</span>&#160;{</div>
+<div class="line"><a name="l02129"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2129</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="l02130"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2130</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="l02131"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2131</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="l02132"></a><span class="lineno"> 2132</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div>
+<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160; </div>
+<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vmaCalculateStats</a>(</div>
+<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
+<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160; </div>
+<div class="line"><a name="l02149"></a><span class="lineno"><a class="line" href="struct_vma_budget.html"> 2149</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_budget.html">VmaBudget</a></div>
+<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;{</div>
+<div class="line"><a name="l02153"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0"> 2153</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
+<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;    </div>
+<div class="line"><a name="l02161"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8"> 2161</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a>;</div>
+<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;    </div>
+<div class="line"><a name="l02171"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6"> 2171</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>;</div>
+<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;    </div>
+<div class="line"><a name="l02182"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd"> 2182</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
+<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">VmaBudget</a>;</div>
+<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160; </div>
+<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vmaGetBudget</a>(</div>
+<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget);</div>
+<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160; </div>
+<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;<span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02200"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2200</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div>
+<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160; </div>
+<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160; </div>
+<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160; </div>
+<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vmaBuildStatsString</a>(</div>
+<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div>
+<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;    VkBool32 detailedMap);</div>
+<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160; </div>
+<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString</a>(</div>
+<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div>
+<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160; </div>
+<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160; </div>
+<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div>
+<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160; </div>
+<div class="line"><a name="l02229"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2229</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div>
+<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;{</div>
+<div class="line"><a name="l02234"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2234</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="l02251"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2251</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="l02261"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2261</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="l02268"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2268</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="l02277"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2277</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="l02278"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 2278</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="l02279"></a><span class="lineno"> 2279</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div>
+<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160; </div>
+<div class="line"><a name="l02282"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2282</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="l02289"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2289</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="l02290"></a><span class="lineno"> 2290</span>&#160; </div>
+<div class="line"><a name="l02300"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2300</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="l02313"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2313</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="l02326"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2326</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="l02333"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2333</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="l02339"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2339</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="l02344"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2344</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="l02350"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2350</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div>
+<div class="line"><a name="l02354"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"> 2354</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100,</div>
+<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160; </div>
+<div class="line"><a name="l02359"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2359</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="l02363"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2363</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="l02370"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2370</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="l02371"></a><span class="lineno"> 2371</span>&#160; </div>
+<div class="line"><a name="l02374"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2374</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="l02377"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2377</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="l02380"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2380</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="l02381"></a><span class="lineno"> 2381</span>&#160; </div>
+<div class="line"><a name="l02384"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2384</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="l02385"></a><span class="lineno"> 2385</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="l02386"></a><span class="lineno"> 2386</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="l02387"></a><span class="lineno"> 2387</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="l02388"></a><span class="lineno"> 2388</span>&#160; </div>
+<div class="line"><a name="l02389"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 2389</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="l02390"></a><span class="lineno"> 2390</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div>
+<div class="line"><a name="l02391"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2391</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="l02392"></a><span class="lineno"> 2392</span>&#160; </div>
+<div class="line"><a name="l02393"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2393</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="l02394"></a><span class="lineno"> 2394</span>&#160;{</div>
+<div class="line"><a name="l02396"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2396</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="l02402"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2402</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="l02407"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2407</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
+<div class="line"><a name="l02412"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2412</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
+<div class="line"><a name="l02420"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2420</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
+<div class="line"><a name="l02426"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2426</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="l02433"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2433</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="l02434"></a><span class="lineno"> 2434</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div>
+<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160; </div>
+<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;    uint32_t memoryTypeBits,</div>
+<div class="line"><a name="l02455"></a><span class="lineno"> 2455</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="l02456"></a><span class="lineno"> 2456</span>&#160;    uint32_t* pMemoryTypeIndex);</div>
+<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160; </div>
+<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
+<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l02473"></a><span class="lineno"> 2473</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="l02474"></a><span class="lineno"> 2474</span>&#160;    uint32_t* pMemoryTypeIndex);</div>
+<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160; </div>
+<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
+<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l02491"></a><span class="lineno"> 2491</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="l02492"></a><span class="lineno"> 2492</span>&#160;    uint32_t* pMemoryTypeIndex);</div>
+<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160; </div>
+<div class="line"><a name="l02495"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2495</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="l02513"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2513</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="l02514"></a><span class="lineno"> 2514</span>&#160; </div>
+<div class="line"><a name="l02530"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2530</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="l02531"></a><span class="lineno"> 2531</span>&#160; </div>
+<div class="line"><a name="l02541"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2541</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="l02542"></a><span class="lineno"> 2542</span>&#160; </div>
+<div class="line"><a name="l02545"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2545</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="l02546"></a><span class="lineno"> 2546</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="l02547"></a><span class="lineno"> 2547</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="l02548"></a><span class="lineno"> 2548</span>&#160; </div>
+<div class="line"><a name="l02549"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 2549</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="l02550"></a><span class="lineno"> 2550</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div>
+<div class="line"><a name="l02551"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2551</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="l02552"></a><span class="lineno"> 2552</span>&#160; </div>
+<div class="line"><a name="l02555"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2555</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="l02558"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 2558</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div>
+<div class="line"><a name="l02561"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 2561</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="l02570"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 2570</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div>
+<div class="line"><a name="l02575"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 2575</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="l02583"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 2583</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="l02597"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 2597</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div>
+<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div>
+<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160; </div>
+<div class="line"><a name="l02602"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 2602</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="l02605"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 2605</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div>
+<div class="line"><a name="l02608"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 2608</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div>
+<div class="line"><a name="l02611"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 2611</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="l02614"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 2614</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="l02621"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 2621</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div>
+<div class="line"><a name="l02624"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 2624</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="l02625"></a><span class="lineno"> 2625</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div>
+<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160; </div>
+<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a>(</div>
+<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02635"></a><span class="lineno"> 2635</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="l02636"></a><span class="lineno"> 2636</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div>
+<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160; </div>
+<div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a>(</div>
+<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160; </div>
+<div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vmaGetPoolStats</a>(</div>
+<div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div>
+<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160; </div>
+<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vmaMakePoolAllocationsLost</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;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
+<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160; </div>
+<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">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="l02681"></a><span class="lineno"> 2681</span>&#160; </div>
+<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div>
+<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160; </div>
+<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160; </div>
+<div class="line"><a name="l02710"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 2710</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div>
+<div class="line"><a name="l02715"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 2715</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div>
+<div class="line"><a name="l02724"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 2724</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div>
+<div class="line"><a name="l02729"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 2729</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div>
+<div class="line"><a name="l02734"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 2734</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div>
+<div class="line"><a name="l02743"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 2743</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="l02748"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 2748</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="l02749"></a><span class="lineno"> 2749</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div>
+<div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160; </div>
+<div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vmaAllocateMemory</a>(</div>
+<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l02764"></a><span class="lineno"> 2764</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="l02765"></a><span class="lineno"> 2765</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160; </div>
+<div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vmaAllocateMemoryPages</a>(</div>
+<div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l02790"></a><span class="lineno"> 2790</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="l02791"></a><span class="lineno"> 2791</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160; </div>
+<div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer</a>(</div>
+<div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l02804"></a><span class="lineno"> 2804</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="l02805"></a><span class="lineno"> 2805</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</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;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vmaAllocateMemoryForImage</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;    VkImage image,</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>* pCreateInfo,</div>
+<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160; </div>
+<div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a>(</div>
+<div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160; </div>
+<div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160; </div>
+<div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vmaResizeAllocation</a>(</div>
+<div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;    VkDeviceSize newSize);</div>
+<div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160; </div>
+<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(</div>
+<div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160; </div>
+<div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkBool32 <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a>(</div>
+<div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160; </div>
+<div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vmaSetAllocationUserData</a>(</div>
+<div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div>
+<div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160; </div>
+<div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vmaCreateLostAllocation</a>(</div>
+<div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160; </div>
+<div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a>(</div>
+<div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;    <span class="keywordtype">void</span>** ppData);</div>
+<div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160; </div>
+<div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a>(</div>
+<div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160; </div>
+<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">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="l02985"></a><span class="lineno"> 2985</span>&#160; </div>
+<div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">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="l03003"></a><span class="lineno"> 3003</span>&#160; </div>
+<div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits);</div>
+<div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160; </div>
+<div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div>
+<div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160; </div>
+<div class="line"><a name="l03030"></a><span class="lineno"> 3030</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="l03032"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"> 3032</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="l03033"></a><span class="lineno"> 3033</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div>
+<div class="line"><a name="l03034"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 3034</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="l03035"></a><span class="lineno"> 3035</span>&#160; </div>
+<div class="line"><a name="l03040"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 3040</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="l03043"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 3043</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="l03046"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 3046</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div>
+<div class="line"><a name="l03055"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96"> 3055</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="l03061"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 3061</a></span>&#160;    VkBool32* <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div>
+<div class="line"><a name="l03064"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 3064</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div>
+<div class="line"><a name="l03080"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1"> 3080</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* <a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>;</div>
+<div class="line"><a name="l03085"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 3085</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div>
+<div class="line"><a name="l03090"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 3090</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div>
+<div class="line"><a name="l03095"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 3095</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div>
+<div class="line"><a name="l03100"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 3100</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div>
+<div class="line"><a name="l03109"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 3109</a></span>&#160;    VkCommandBuffer <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div>
+<div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">VmaDefragmentationInfo2</a>;</div>
+<div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160; </div>
+<div class="line"><a name="l03116"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 3116</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="l03121"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 3121</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
+<div class="line"><a name="l03126"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 3126</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
+<div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div>
+<div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160; </div>
+<div class="line"><a name="l03130"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 3130</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="l03132"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 3132</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div>
+<div class="line"><a name="l03134"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 3134</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div>
+<div class="line"><a name="l03136"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 3136</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div>
+<div class="line"><a name="l03138"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 3138</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
+<div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div>
+<div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160; </div>
+<div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a>(</div>
+<div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03172"></a><span class="lineno"> 3172</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="l03173"></a><span class="lineno"> 3173</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext);</div>
+<div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160; </div>
+<div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a>(</div>
+<div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
+<div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160; </div>
+<div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">vmaDefragment</a>(</div>
+<div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;    VkBool32* pAllocationsChanged,</div>
+<div class="line"><a name="l03230"></a><span class="lineno"> 3230</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="l03231"></a><span class="lineno"> 3231</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div>
+<div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160; </div>
+<div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a>(</div>
+<div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;    VkBuffer buffer);</div>
+<div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160; </div>
+<div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vmaBindBufferMemory2</a>(</div>
+<div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160; </div>
+<div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vmaBindImageMemory</a>(</div>
+<div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;    VkImage image);</div>
+<div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160; </div>
+<div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vmaBindImageMemory2</a>(</div>
+<div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160; </div>
+<div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l03330"></a><span class="lineno"> 3330</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="l03331"></a><span class="lineno"> 3331</span>&#160;    VkBuffer* pBuffer,</div>
+<div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160; </div>
+<div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a>(</div>
+<div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160; </div>
+<div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a>(</div>
+<div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l03355"></a><span class="lineno"> 3355</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="l03356"></a><span class="lineno"> 3356</span>&#160;    VkImage* pImage,</div>
+<div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160; </div>
+<div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vmaDestroyImage</a>(</div>
+<div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</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;<span class="preprocessor">#ifdef __cplusplus</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="preprocessor">#endif</span></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="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div>
+<div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160; </div>
+<div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div>
+<div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div>
+<div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160; </div>
+<div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160; </div>
+<div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div>
+<div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
+<div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div>
+<div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160; </div>
+<div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;<span class="comment">/*******************************************************************************</span></div>
+<div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div>
+<div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l03397"></a><span class="lineno"> 3397</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="l03398"></a><span class="lineno"> 3398</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div>
+<div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;<span class="comment">*/</span></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;<span class="comment">/*</span></div>
+<div class="line"><a name="l03402"></a><span class="lineno"> 3402</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="l03403"></a><span class="lineno"> 3403</span>&#160;<span class="comment">internally, like:</span></div>
+<div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div>
+<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l03407"></a><span class="lineno"> 3407</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="l03408"></a><span class="lineno"> 3408</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div>
+<div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div>
+<div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div>
+<div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;<span class="preprocessor">#endif</span></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="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="l03415"></a><span class="lineno"> 3415</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></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="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div>
+<div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</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">Set it to 0 or undefined to make the library using its own implementation of</span></div>
+<div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;<span class="comment">the containers.</span></div>
+<div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div>
+<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div>
+<div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div>
+<div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div>
+<div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160; </div>
+<div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;<span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;    <span class="comment">// Compiler conforms to C++17.</span></div>
+<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;<span class="preprocessor">    #if __cplusplus &gt;= 201703L</span></div>
+<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
+<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div>
+<div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;    <span class="comment">// Otherwise it&#39;s always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div>
+<div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;    <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div>
+<div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;<span class="preprocessor">    #elif defined(_MSC_FULL_VER) &amp;&amp; _MSC_FULL_VER &gt;= 190023918 &amp;&amp; __cplusplus == 199711L &amp;&amp; _MSVC_LANG &gt;= 201703L</span></div>
+<div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
+<div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 0</span></div>
+<div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">/*</span></div>
+<div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;<span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div>
+<div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;<span class="comment">Library has its own container implementation.</span></div>
+<div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div>
+<div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160; </div>
+<div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div>
+<div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div>
+<div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160; </div>
+<div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l03460"></a><span class="lineno"> 3460</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="l03461"></a><span class="lineno"> 3461</span>&#160;<span class="comment">remove them if not needed.</span></div>
+<div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div>
+<div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div>
+<div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span></div>
+<div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160; </div>
+<div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div>
+<div class="line"><a name="l03468"></a><span class="lineno"> 3468</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="l03469"></a><span class="lineno"> 3469</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div>
+<div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;<span class="preprocessor">#endif</span></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 defined(__ANDROID_API__) &amp;&amp; (__ANDROID_API__ &lt; 16)</span></div>
+<div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
+<div class="line"><a name="l03474"></a><span class="lineno"> 3474</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="l03475"></a><span class="lineno"> 3475</span>&#160;{</div>
+<div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
+<div class="line"><a name="l03477"></a><span class="lineno"> 3477</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="l03478"></a><span class="lineno"> 3478</span>&#160;    {</div>
+<div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</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="keywordflow">return</span> memalign(alignment, size);</div>
+<div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;}</div>
+<div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;<span class="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) &amp;&amp; defined(__GLIBCXX__) &amp;&amp; !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))</span></div>
+<div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
+<div class="line"><a name="l03486"></a><span class="lineno"> 3486</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="l03487"></a><span class="lineno"> 3487</span>&#160;{</div>
+<div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
+<div class="line"><a name="l03489"></a><span class="lineno"> 3489</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="l03490"></a><span class="lineno"> 3490</span>&#160;    {</div>
+<div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</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; </div>
+<div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;    <span class="keywordtype">void</span> *pointer;</div>
+<div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div>
+<div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;        <span class="keywordflow">return</span> pointer;</div>
+<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</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;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160; </div>
+<div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div>
+<div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div>
+<div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160; </div>
+<div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></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;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div>
+<div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div>
+<div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div>
+<div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div>
+<div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div>
+<div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;<span class="preprocessor">   #endif</span></div>
+<div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div>
+<div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div>
+<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div>
+<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div>
+<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div>
+<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div>
+<div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;<span class="preprocessor">   #endif</span></div>
+<div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div>
+<div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div>
+<div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div>
+<div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div>
+<div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div>
+<div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div>
+<div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;<span class="preprocessor">   #endif</span></div>
+<div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160; </div>
+<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div>
+<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div>
+<div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div>
+<div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div>
+<div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;<span class="preprocessor">   #endif</span></div>
+<div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_MIN</span></div>
+<div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div>
+<div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160; </div>
+<div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div>
+<div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div>
+<div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160; </div>
+<div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div>
+<div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div>
+<div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160; </div>
+<div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
+<div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div>
+<div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div>
+<div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div>
+<div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;   <span class="comment">/*</span></div>
+<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div>
+<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div>
+<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div>
+<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;<span class="comment">   } while(false)</span></div>
+<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;<span class="comment">   */</span></div>
+<div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160; </div>
+<div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div>
+<div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l03573"></a><span class="lineno"> 3573</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="l03574"></a><span class="lineno"> 3574</span>&#160;    {</div>
+<div class="line"><a name="l03575"></a><span class="lineno"> 3575</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="l03576"></a><span class="lineno"> 3576</span>&#160;    }</div>
+<div class="line"><a name="l03577"></a><span class="lineno"> 3577</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="l03578"></a><span class="lineno"> 3578</span>&#160;    {</div>
+<div class="line"><a name="l03579"></a><span class="lineno"> 3579</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="l03580"></a><span class="lineno"> 3580</span>&#160;    }</div>
+<div class="line"><a name="l03581"></a><span class="lineno"> 3581</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="l03582"></a><span class="lineno"> 3582</span>&#160;    {</div>
+<div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div>
+<div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;    }</div>
+<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160; </div>
+<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div>
+<div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;    <span class="keyword">class </span>VmaMutex</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="keyword">public</span>:</div>
+<div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div>
+<div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div>
+<div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;        std::mutex m_Mutex;</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;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div>
+<div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160; </div>
+<div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;<span class="comment">// Read-write mutex, where &quot;read&quot; is shared access, &quot;write&quot; is exclusive access.</span></div>
+<div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;<span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div>
+<div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;<span class="preprocessor">    #if VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;        <span class="comment">// Use std::shared_mutex from C++17.</span></div>
+<div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;<span class="preprocessor">        #include &lt;shared_mutex&gt;</span></div>
+<div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;        <span class="keyword">class </span>VmaRWMutex</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="keyword">public</span>:</div>
+<div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div>
+<div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div>
+<div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div>
+<div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div>
+<div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;            std::shared_mutex m_Mutex;</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="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;<span class="preprocessor">    #elif defined(_WIN32) &amp;&amp; defined(WINVER) &amp;&amp; WINVER &gt;= 0x0600</span></div>
+<div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;        <span class="comment">// Use SRWLOCK from WinAPI.</span></div>
+<div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;        <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div>
+<div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
+<div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;        {</div>
+<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;        <span class="keyword">public</span>:</div>
+<div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;            VmaRWMutex() { InitializeSRWLock(&amp;m_Lock); }</div>
+<div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;            <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&amp;m_Lock); }</div>
+<div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&amp;m_Lock); }</div>
+<div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;            <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&amp;m_Lock); }</div>
+<div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&amp;m_Lock); }</div>
+<div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;            SRWLOCK m_Lock;</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;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;        <span class="comment">// Less efficient fallback: Use normal mutex.</span></div>
+<div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;        <span class="keyword">class </span>VmaRWMutex</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;        <span class="keyword">public</span>:</div>
+<div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div>
+<div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div>
+<div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div>
+<div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div>
+<div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;            VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;        };</div>
+<div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;<span class="preprocessor">    #endif // #if VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_RW_MUTEX</span></div>
+<div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160; </div>
+<div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l03647"></a><span class="lineno"> 3647</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="l03648"></a><span class="lineno"> 3648</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div>
+<div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
+<div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div>
+<div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160; </div>
+<div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT64</span></div>
+<div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
+<div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT64 std::atomic&lt;uint64_t&gt;</span></div>
+<div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div>
+<div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160; </div>
+<div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div>
+<div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div>
+<div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160; </div>
+<div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div>
+<div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div>
+<div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160; </div>
+<div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div>
+<div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div>
+<div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160; </div>
+<div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div>
+<div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160; </div>
+<div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160; </div>
+<div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div>
+<div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div>
+<div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160; </div>
+<div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div>
+<div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;<span class="preprocessor">#endif</span></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">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div>
+<div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160; </div>
+<div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div>
+<div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160; </div>
+<div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div>
+<div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div>
+<div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div>
+<div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div>
+<div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160; </div>
+<div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div>
+<div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div>
+<div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;<span class="preprocessor">        private: \</span></div>
+<div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div>
+<div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div>
+<div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160; </div>
+<div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</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;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div>
+<div class="line"><a name="l03736"></a><span class="lineno"> 3736</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="l03737"></a><span class="lineno"> 3737</span>&#160; </div>
+<div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div>
+<div class="line"><a name="l03739"></a><span class="lineno"> 3739</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="l03740"></a><span class="lineno"> 3740</span>&#160; </div>
+<div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;<span class="comment">/*******************************************************************************</span></div>
+<div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;<span class="comment">END OF CONFIGURATION</span></div>
+<div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160; </div>
+<div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</div>
+<div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160; </div>
+<div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div>
+<div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div>
+<div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160; </div>
+<div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div>
+<div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</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;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div>
+<div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div>
+<div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div>
+<div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div>
+<div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div>
+<div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;    <span class="keywordflow">return</span> c;</div>
+<div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;}</div>
+<div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160; </div>
+<div class="line"><a name="l03761"></a><span class="lineno"> 3761</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="l03762"></a><span class="lineno"> 3762</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
+<div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div>
+<div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;{</div>
+<div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div>
+<div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;}</div>
+<div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div>
+<div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
+<div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</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="keywordflow">return</span> val / align * align;</div>
+<div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;}</div>
+<div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160; </div>
+<div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div>
+<div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</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="keywordflow">return</span> (x + (y / (T)2)) / y;</div>
+<div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;}</div>
+<div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160; </div>
+<div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div>
+<div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div>
+<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;<span class="comment">For 0 returns true.</span></div>
+<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</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="keywordflow">return</span> (x &amp; (x-1)) == 0;</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; </div>
+<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div>
+<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</div>
+<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;{</div>
+<div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;    v--;</div>
+<div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;    v++;</div>
+<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;    <span class="keywordflow">return</span> v;</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="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</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;    v--;</div>
+<div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;    v |= v &gt;&gt; 32;</div>
+<div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;    v++;</div>
+<div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;    <span class="keywordflow">return</span> v;</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; </div>
+<div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div>
+<div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</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;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
+<div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;    <span class="keywordflow">return</span> v;</div>
+<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;}</div>
+<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div>
+<div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;{</div>
+<div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;    v |= v &gt;&gt; 32;</div>
+<div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
+<div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;    <span class="keywordflow">return</span> v;</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; </div>
+<div class="line"><a name="l03842"></a><span class="lineno"> 3842</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="l03843"></a><span class="lineno"> 3843</span>&#160;{</div>
+<div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;}</div>
+<div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160; </div>
+<div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</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;    <span class="keywordflow">switch</span>(algorithm)</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="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="l03854"></a><span class="lineno"> 3854</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div>
+<div class="line"><a name="l03855"></a><span class="lineno"> 3855</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="l03856"></a><span class="lineno"> 3856</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div>
+<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div>
+<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
+<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;    }</div>
+<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;}</div>
+<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160; </div>
+<div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160; </div>
+<div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
+<div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160; </div>
+<div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div>
+<div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div>
+<div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;{</div>
+<div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;    Iterator centerValue = end; --centerValue;</div>
+<div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;    Iterator insertIndex = beg;</div>
+<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</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;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div>
+<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;        {</div>
+<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</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;                VMA_SWAP(*memTypeIndex, *insertIndex);</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;            ++insertIndex;</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="keywordflow">if</span>(insertIndex != centerValue)</div>
+<div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;    {</div>
+<div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</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;    <span class="keywordflow">return</span> insertIndex;</div>
+<div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;}</div>
+<div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160; </div>
+<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;<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="l03893"></a><span class="lineno"> 3893</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div>
+<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;{</div>
+<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div>
+<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;    {</div>
+<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div>
+<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div>
+<div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div>
+<div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;    }</div>
+<div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;}</div>
+<div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160; </div>
+<div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div>
+<div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160; </div>
+<div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></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="comment">/*</span></div>
+<div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div>
+<div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div>
+<div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l03911"></a><span class="lineno"> 3911</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="l03912"></a><span class="lineno"> 3912</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="l03913"></a><span class="lineno"> 3913</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div>
+<div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;    VkDeviceSize resourceAOffset,</div>
+<div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;    VkDeviceSize resourceASize,</div>
+<div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;    VkDeviceSize resourceBOffset,</div>
+<div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;    VkDeviceSize pageSize)</div>
+<div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;{</div>
+<div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div>
+<div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div>
+<div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div>
+<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div>
+<div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div>
+<div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</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;<span class="keyword">enum</span> VmaSuballocationType</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;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div>
+<div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div>
+<div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div>
+<div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div>
+<div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div>
+<div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div>
+<div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</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="comment">/*</span></div>
+<div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div>
+<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div>
+<div class="line"><a name="l03942"></a><span class="lineno"> 3942</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="l03943"></a><span class="lineno"> 3943</span>&#160;<span class="comment">conservatively.</span></div>
+<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div>
+<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;    VmaSuballocationType suballocType1,</div>
+<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;    VmaSuballocationType suballocType2)</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="keywordflow">if</span>(suballocType1 &gt; suballocType2)</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;        VMA_SWAP(suballocType1, suballocType2);</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;    </div>
+<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</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="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div>
+<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div>
+<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div>
+<div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div>
+<div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div>
+<div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div>
+<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div>
+<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;}</div>
+<div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160; </div>
+<div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div>
+<div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;{</div>
+<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div>
+<div class="line"><a name="l03984"></a><span class="lineno"> 3984</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="l03985"></a><span class="lineno"> 3985</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="l03986"></a><span class="lineno"> 3986</span>&#160;    {</div>
+<div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div>
+<div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;    }</div>
+<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;    <span class="comment">// no-op</span></div>
+<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;}</div>
+<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160; </div>
+<div class="line"><a name="l03994"></a><span class="lineno"> 3994</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="l03995"></a><span class="lineno"> 3995</span>&#160;{</div>
+<div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l03997"></a><span class="lineno"> 3997</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="l03998"></a><span class="lineno"> 3998</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="l03999"></a><span class="lineno"> 3999</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="l04000"></a><span class="lineno"> 4000</span>&#160;    {</div>
+<div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;        }</div>
+<div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;    }</div>
+<div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;}</div>
+<div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160; </div>
+<div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;<span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div>
+<div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;<span class="comment">during GPU memory defragmentation.</span></div>
+<div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo&amp; outBufCreateInfo)</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;    memset(&amp;outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div>
+<div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;    outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div>
+<div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;    outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;    outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></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; </div>
+<div class="line"><a name="l04022"></a><span class="lineno"> 4022</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="l04023"></a><span class="lineno"> 4023</span>&#160;<span class="keyword">struct </span>VmaMutexLock</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;    VMA_CLASS_NO_COPY(VmaMutexLock)</div>
+<div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div>
+<div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Lock(); } }</div>
+<div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;    ~VmaMutexLock()</div>
+<div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Unlock(); } }</div>
+<div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;    VMA_MUTEX* m_pMutex;</div>
+<div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;};</div>
+<div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160; </div>
+<div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div>
+<div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;<span class="keyword">struct </span>VmaMutexLockRead</div>
+<div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;{</div>
+<div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockRead)</div>
+<div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;    VmaMutexLockRead(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
+<div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockRead(); } }</div>
+<div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;    ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockRead(); } }</div>
+<div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;    VMA_RW_MUTEX* m_pMutex;</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="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div>
+<div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;<span class="keyword">struct </span>VmaMutexLockWrite</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_CLASS_NO_COPY(VmaMutexLockWrite)</div>
+<div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    VmaMutexLockWrite(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
+<div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockWrite(); } }</div>
+<div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;    ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockWrite(); } }</div>
+<div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div>
+<div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;};</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="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div>
+<div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div>
+<div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div>
+<div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div>
+<div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160; </div>
+<div class="line"><a name="l04069"></a><span class="lineno"> 4069</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="l04070"></a><span class="lineno"> 4070</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="l04071"></a><span class="lineno"> 4071</span>&#160; </div>
+<div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div>
+<div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div>
+<div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div>
+<div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04078"></a><span class="lineno"> 4078</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="l04079"></a><span class="lineno"> 4079</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div>
+<div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04081"></a><span class="lineno"> 4081</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="l04082"></a><span class="lineno"> 4082</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, <span class="keyword">const</span> CmpLess&amp; cmp)</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="keywordtype">size_t</span> down = 0, up = (end - beg);</div>
+<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</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">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div>
+<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</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;            down = mid + 1;</div>
+<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;        }</div>
+<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;        <span class="keywordflow">else</span></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;            up = mid;</div>
+<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;        }</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">return</span> beg + down;</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; </div>
+<div class="line"><a name="l04100"></a><span class="lineno"> 4100</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="l04101"></a><span class="lineno"> 4101</span>&#160;IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value, <span class="keyword">const</span> CmpLess&amp; cmp)</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;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div>
+<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;        beg, end, value, cmp);</div>
+<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div>
+<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;        (!cmp(*it, value) &amp;&amp; !cmp(value, *it)))</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">return</span> it;</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;    <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;}</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;<span class="comment">/*</span></div>
+<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;<span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div>
+<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;<span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div>
+<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;<span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div>
+<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;<span class="comment">*/</span></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="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</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;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; count; ++i)</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="keyword">const</span> T iPtr = arr[i];</div>
+<div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;        <span class="keywordflow">if</span>(iPtr == 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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        <span class="keywordflow">for</span>(uint32_t j = i + 1; j &lt; count; ++j)</div>
+<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        {</div>
+<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;            <span class="keywordflow">if</span>(iPtr == arr[j])</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;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        }</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;}</div>
+<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160; </div>
+<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;<span class="comment">// Memory allocation</span></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="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="l04143"></a><span class="lineno"> 4143</span>&#160;{</div>
+<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
+<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div>
+<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;    {</div>
+<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div>
+<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div>
+<div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;            size,</div>
+<div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;            alignment,</div>
+<div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</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;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</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;}</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;<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="l04160"></a><span class="lineno"> 4160</span>&#160;{</div>
+<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
+<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div>
+<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;    {</div>
+<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</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">else</span></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;        VMA_SYSTEM_FREE(ptr);</div>
+<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;    }</div>
+<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;}</div>
+<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160; </div>
+<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</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;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</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; </div>
+<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04179"></a><span class="lineno"> 4179</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="l04180"></a><span class="lineno"> 4180</span>&#160;{</div>
+<div class="line"><a name="l04181"></a><span class="lineno"> 4181</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="l04182"></a><span class="lineno"> 4182</span>&#160;}</div>
+<div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160; </div>
+<div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div>
+<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160; </div>
+<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04189"></a><span class="lineno"> 4189</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="l04190"></a><span class="lineno"> 4190</span>&#160;{</div>
+<div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;    ptr-&gt;~T();</div>
+<div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</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; </div>
+<div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04196"></a><span class="lineno"> 4196</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="l04197"></a><span class="lineno"> 4197</span>&#160;{</div>
+<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;    {</div>
+<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
+<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;        {</div>
+<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;            ptr[i].~T();</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;        VmaFree(pAllocationCallbacks, ptr);</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; </div>
+<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;<span class="comment">// STL-compatible allocator.</span></div>
+<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div>
+<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;{</div>
+<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div>
+<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
+<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;    </div>
+<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div>
+<div class="line"><a name="l04217"></a><span class="lineno"> 4217</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="l04218"></a><span class="lineno"> 4218</span>&#160; </div>
+<div class="line"><a name="l04219"></a><span class="lineno"> 4219</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="l04220"></a><span class="lineno"> 4220</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="l04221"></a><span class="lineno"> 4221</span>&#160; </div>
+<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
+<div class="line"><a name="l04223"></a><span class="lineno"> 4223</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="l04224"></a><span class="lineno"> 4224</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div>
+<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;    }</div>
+<div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
+<div class="line"><a name="l04228"></a><span class="lineno"> 4228</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="l04229"></a><span class="lineno"> 4229</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div>
+<div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;    }</div>
+<div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160; </div>
+<div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</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; </div>
+<div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></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="preprocessor">#define VmaVector std::vector</span></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;<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="l04241"></a><span class="lineno"> 4241</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="l04242"></a><span class="lineno"> 4242</span>&#160;{</div>
+<div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;    vec.insert(vec.begin() + index, item);</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; </div>
+<div class="line"><a name="l04246"></a><span class="lineno"> 4246</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="l04247"></a><span class="lineno"> 4247</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="l04248"></a><span class="lineno"> 4248</span>&#160;{</div>
+<div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;    vec.erase(vec.begin() + index);</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;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160; </div>
+<div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div>
+<div class="line"><a name="l04255"></a><span class="lineno"> 4255</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="l04256"></a><span class="lineno"> 4256</span>&#160;<span class="comment">used for these objects. */</span></div>
+<div class="line"><a name="l04257"></a><span class="lineno"> 4257</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="l04258"></a><span class="lineno"> 4258</span>&#160;<span class="keyword">class </span>VmaVector</div>
+<div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;{</div>
+<div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
+<div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160; </div>
+<div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;        m_Allocator(allocator),</div>
+<div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;        m_pArray(VMA_NULL),</div>
+<div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;        m_Count(0),</div>
+<div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;        m_Capacity(0)</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; </div>
+<div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;        m_Allocator(allocator),</div>
+<div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div>
+<div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;        m_Count(count),</div>
+<div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;        m_Capacity(count)</div>
+<div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;    {</div>
+<div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    }</div>
+<div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    </div>
+<div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;    <span class="comment">// This version of the constructor is here for compatibility with pre-C++14 std::vector.</span></div>
+<div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;    <span class="comment">// value is unused.</span></div>
+<div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> T&amp; value, <span class="keyword">const</span> AllocatorT&amp; allocator)</div>
+<div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;        : VmaVector(count, allocator) {}</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;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div>
+<div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;        m_Allocator(src.m_Allocator),</div>
+<div class="line"><a name="l04286"></a><span class="lineno"> 4286</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="l04287"></a><span class="lineno"> 4287</span>&#160;        m_Count(src.m_Count),</div>
+<div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;        m_Capacity(src.m_Count)</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;        <span class="keywordflow">if</span>(m_Count != 0)</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;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;    }</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;    ~VmaVector()</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;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</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; </div>
+<div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</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="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div>
+<div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;        {</div>
+<div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;            resize(rhs.m_Count);</div>
+<div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</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;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;        }</div>
+<div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
+<div class="line"><a name="l04315"></a><span class="lineno"> 4315</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="l04316"></a><span class="lineno"> 4316</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div>
+<div class="line"><a name="l04317"></a><span class="lineno"> 4317</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="l04318"></a><span class="lineno"> 4318</span>&#160;    </div>
+<div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</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;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</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">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div>
+<div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</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; </div>
+<div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;    T&amp; front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
+<div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;    }</div>
+<div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div>
+<div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
+<div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;    }</div>
+<div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;    T&amp; back()</div>
+<div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;    {</div>
+<div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</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;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div>
+<div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div>
+<div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;    }</div>
+<div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160; </div>
+<div class="line"><a name="l04351"></a><span class="lineno"> 4351</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="l04352"></a><span class="lineno"> 4352</span>&#160;    {</div>
+<div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</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="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</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;            newCapacity = m_Capacity;</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;        </div>
+<div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</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;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div>
+<div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</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;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;            m_Capacity = newCapacity;</div>
+<div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;            m_pArray = newArray;</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; </div>
+<div class="line"><a name="l04373"></a><span class="lineno"> 4373</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="l04374"></a><span class="lineno"> 4374</span>&#160;    {</div>
+<div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div>
+<div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div>
+<div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;        {</div>
+<div class="line"><a name="l04378"></a><span class="lineno"> 4378</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="l04379"></a><span class="lineno"> 4379</span>&#160;        }</div>
+<div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</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;            newCapacity = newCount;</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; </div>
+<div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div>
+<div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;        {</div>
+<div class="line"><a name="l04387"></a><span class="lineno"> 4387</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="l04388"></a><span class="lineno"> 4388</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="l04389"></a><span class="lineno"> 4389</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div>
+<div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;            {</div>
+<div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</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;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;            m_Capacity = newCapacity;</div>
+<div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;            m_pArray = newArray;</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; </div>
+<div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;        m_Count = newCount;</div>
+<div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    }</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;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
+<div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;    {</div>
+<div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;        resize(0, freeMemory);</div>
+<div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;    }</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">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;    {</div>
+<div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div>
+<div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;        resize(oldCount + 1);</div>
+<div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div>
+<div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;        {</div>
+<div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</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;        m_pArray[index] = src;</div>
+<div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;    }</div>
+<div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160; </div>
+<div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;    {</div>
+<div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</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;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</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;        resize(oldCount - 1);</div>
+<div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;    }</div>
+<div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160; </div>
+<div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</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="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div>
+<div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;        resize(newIndex + 1);</div>
+<div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;        m_pArray[newIndex] = src;</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; </div>
+<div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;    <span class="keywordtype">void</span> pop_back()</div>
+<div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;    {</div>
+<div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;        resize(size() - 1);</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; </div>
+<div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</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;        insert(0, src);</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="keywordtype">void</span> pop_front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;        remove(0);</div>
+<div class="line"><a name="l04451"></a><span class="lineno"> 4451</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">typedef</span> T* iterator;</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_pArray; }</div>
+<div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</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="keyword">private</span>:</div>
+<div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;    AllocatorT m_Allocator;</div>
+<div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;    T* m_pArray;</div>
+<div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
+<div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div>
+<div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;};</div>
+<div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160; </div>
+<div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l04466"></a><span class="lineno"> 4466</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="l04467"></a><span class="lineno"> 4467</span>&#160;{</div>
+<div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;    vec.insert(index, item);</div>
+<div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;}</div>
+<div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160; </div>
+<div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l04472"></a><span class="lineno"> 4472</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="l04473"></a><span class="lineno"> 4473</span>&#160;{</div>
+<div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    vec.remove(index);</div>
+<div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;}</div>
+<div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160; </div>
+<div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></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;<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="l04480"></a><span class="lineno"> 4480</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="l04481"></a><span class="lineno"> 4481</span>&#160;{</div>
+<div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;        vector.data(),</div>
+<div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;        vector.data() + vector.size(),</div>
+<div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;        value,</div>
+<div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;        CmpLess()) - vector.data();</div>
+<div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div>
+<div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div>
+<div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;}</div>
+<div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160; </div>
+<div class="line"><a name="l04491"></a><span class="lineno"> 4491</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="l04492"></a><span class="lineno"> 4492</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="l04493"></a><span class="lineno"> 4493</span>&#160;{</div>
+<div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    CmpLess comparator;</div>
+<div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;        vector.begin(),</div>
+<div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;        vector.end(),</div>
+<div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;        value,</div>
+<div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;        comparator);</div>
+<div class="line"><a name="l04500"></a><span class="lineno"> 4500</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="l04501"></a><span class="lineno"> 4501</span>&#160;    {</div>
+<div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div>
+<div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div>
+<div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</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> <span class="keyword">false</span>;</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="l04510"></a><span class="lineno"> 4510</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div>
+<div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160; </div>
+<div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04513"></a><span class="lineno"> 4513</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="l04514"></a><span class="lineno"> 4514</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div>
+<div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div>
+<div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div>
+<div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;{</div>
+<div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div>
+<div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div>
+<div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;    ~VmaPoolAllocator();</div>
+<div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    T* Alloc();</div>
+<div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div>
+<div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160; </div>
+<div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;    <span class="keyword">union </span>Item</div>
+<div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;    {</div>
+<div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;        uint32_t NextFreeIndex;</div>
+<div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;        <span class="keyword">alignas</span>(T) <span class="keywordtype">char</span> Value[<span class="keyword">sizeof</span>(T)];</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="keyword">struct </span>ItemBlock</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;        Item* pItems;</div>
+<div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;        uint32_t Capacity;</div>
+<div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;        uint32_t FirstFreeIndex;</div>
+<div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;    };</div>
+<div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;    </div>
+<div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div>
+<div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;    <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div>
+<div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</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;    ItemBlock&amp; CreateNewBlock();</div>
+<div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;};</div>
+<div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160; </div>
+<div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div>
+<div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
+<div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;    m_FirstBlockCapacity(firstBlockCapacity),</div>
+<div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div>
+<div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;{</div>
+<div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;    VMA_ASSERT(m_FirstBlockCapacity &gt; 1);</div>
+<div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;}</div>
+<div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160; </div>
+<div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div>
+<div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;    m_ItemBlocks.clear();</div>
+<div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;}</div>
+<div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160; </div>
+<div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div>
+<div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;{</div>
+<div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;    {</div>
+<div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
+<div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div>
+<div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</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;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div>
+<div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
+<div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;            T* result = (T*)&amp;pItem-&gt;Value;</div>
+<div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;            <span class="keyword">new</span>(result)T(); <span class="comment">// Explicit constructor call.</span></div>
+<div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;        }</div>
+<div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;    }</div>
+<div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160; </div>
+<div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div>
+<div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div>
+<div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div>
+<div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
+<div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;    T* result = (T*)&amp;pItem-&gt;Value;</div>
+<div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    <span class="keyword">new</span>(result)T(); <span class="comment">// Explicit constructor call.</span></div>
+<div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;    <span class="keywordflow">return</span> result;</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; </div>
+<div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</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;    <span class="comment">// Search all memory blocks to find ptr.</span></div>
+<div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;    {</div>
+<div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
+<div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;        </div>
+<div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;        <span class="comment">// Casting to union.</span></div>
+<div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;        Item* pItemPtr;</div>
+<div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</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="comment">// Check if pItemPtr is in address range of this block.</span></div>
+<div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + block.Capacity))</div>
+<div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;        {</div>
+<div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;            ptr-&gt;~T(); <span class="comment">// Explicit destructor call.</span></div>
+<div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;            <span class="keyword">const</span> uint32_t index = static_cast&lt;uint32_t&gt;(pItemPtr - block.pItems);</div>
+<div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div>
+<div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;            block.FirstFreeIndex = index;</div>
+<div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;            <span class="keywordflow">return</span>;</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;    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="l04614"></a><span class="lineno"> 4614</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div>
+<div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;{</div>
+<div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;    <span class="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div>
+<div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;        m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</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="keyword">const</span> ItemBlock newBlock = {</div>
+<div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div>
+<div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;        newBlockCapacity,</div>
+<div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;        0 };</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;    m_ItemBlocks.push_back(newBlock);</div>
+<div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160; </div>
+<div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div>
+<div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; newBlockCapacity - 1; ++i)</div>
+<div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div>
+<div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;    newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div>
+<div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;}</div>
+<div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160; </div>
+<div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div>
+<div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160; </div>
+<div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160; </div>
+<div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;<span class="preprocessor">#define VmaList std::list</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="preprocessor">#else // #if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160; </div>
+<div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;<span class="keyword">struct </span>VmaListItem</div>
+<div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;{</div>
+<div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    VmaListItem* pPrev;</div>
+<div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;    VmaListItem* pNext;</div>
+<div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;    T Value;</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; </div>
+<div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;<span class="comment">// Doubly linked list.</span></div>
+<div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;<span class="keyword">class </span>VmaRawList</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;    VMA_CLASS_NO_COPY(VmaRawList)</div>
+<div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div>
+<div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160; </div>
+<div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div>
+<div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    ~VmaRawList();</div>
+<div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;    <span class="keywordtype">void</span> Clear();</div>
+<div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160; </div>
+<div class="line"><a name="l04665"></a><span class="lineno"> 4665</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="l04666"></a><span class="lineno"> 4666</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="l04667"></a><span class="lineno"> 4667</span>&#160; </div>
+<div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div>
+<div class="line"><a name="l04669"></a><span class="lineno"> 4669</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="l04670"></a><span class="lineno"> 4670</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div>
+<div class="line"><a name="l04671"></a><span class="lineno"> 4671</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="l04672"></a><span class="lineno"> 4672</span>&#160; </div>
+<div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;    ItemType* PushBack();</div>
+<div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;    ItemType* PushFront();</div>
+<div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;    <span class="keywordtype">void</span> PopBack();</div>
+<div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;    <span class="keywordtype">void</span> PopFront();</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="comment">// Item can be null - it means PushBack.</span></div>
+<div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div>
+<div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div>
+<div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</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;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</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="keywordtype">void</span> Remove(ItemType* pItem);</div>
+<div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160; </div>
+<div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div>
+<div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div>
+<div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    ItemType* m_pFront;</div>
+<div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;    ItemType* m_pBack;</div>
+<div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
+<div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;};</div>
+<div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160; </div>
+<div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
+<div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div>
+<div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;    m_pFront(VMA_NULL),</div>
+<div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;    m_pBack(VMA_NULL),</div>
+<div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;    m_Count(0)</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;}</div>
+<div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160; </div>
+<div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div>
+<div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;{</div>
+<div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div>
+<div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div>
+<div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;}</div>
+<div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160; </div>
+<div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div>
+<div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;{</div>
+<div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;    {</div>
+<div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;        ItemType* pItem = m_pBack;</div>
+<div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;        {</div>
+<div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;            m_ItemAllocator.Free(pItem);</div>
+<div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;            pItem = pPrevItem;</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;        m_pFront = VMA_NULL;</div>
+<div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;        m_pBack = VMA_NULL;</div>
+<div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;        m_Count = 0;</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;}</div>
+<div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160; </div>
+<div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</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;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div>
+<div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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;        pNewItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;        m_Count = 1;</div>
+<div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;    }</div>
+<div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;    {</div>
+<div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div>
+<div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div>
+<div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;    }</div>
+<div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</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;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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;        pNewItem-&gt;pNext = VMA_NULL;</div>
+<div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;        m_Count = 1;</div>
+<div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;    }</div>
+<div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;    {</div>
+<div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div>
+<div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div>
+<div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;    }</div>
+<div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;}</div>
+<div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160; </div>
+<div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04778"></a><span class="lineno"> 4778</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="l04779"></a><span class="lineno"> 4779</span>&#160;{</div>
+<div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div>
+<div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;    pNewItem-&gt;Value = value;</div>
+<div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;}</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">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04786"></a><span class="lineno"> 4786</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="l04787"></a><span class="lineno"> 4787</span>&#160;{</div>
+<div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div>
+<div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;    pNewItem-&gt;Value = value;</div>
+<div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;}</div>
+<div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160; </div>
+<div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div>
+<div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;{</div>
+<div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div>
+<div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div>
+<div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</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;        pPrevItem-&gt;pNext = VMA_NULL;</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;    m_pBack = pPrevItem;</div>
+<div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;    m_ItemAllocator.Free(pBackItem);</div>
+<div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;    --m_Count;</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; </div>
+<div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div>
+<div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;{</div>
+<div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div>
+<div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div>
+<div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div>
+<div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;    {</div>
+<div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;    }</div>
+<div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    m_pFront = pNextItem;</div>
+<div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div>
+<div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;    --m_Count;</div>
+<div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;}</div>
+<div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160; </div>
+<div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</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;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div>
+<div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160; </div>
+<div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</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;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</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;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;    {</div>
+<div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
+<div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        m_pFront = pItem-&gt;pNext;</div>
+<div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;    }</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="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div>
+<div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;    {</div>
+<div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;    }</div>
+<div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    <span class="keywordflow">else</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;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
+<div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;        m_pBack = pItem-&gt;pPrev;</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; </div>
+<div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    m_ItemAllocator.Free(pItem);</div>
+<div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;    --m_Count;</div>
+<div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;}</div>
+<div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160; </div>
+<div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</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="keywordflow">if</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;    {</div>
+<div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;        newItem-&gt;pPrev = prevItem;</div>
+<div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;        newItem-&gt;pNext = pItem;</div>
+<div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;        pItem-&gt;pPrev = newItem;</div>
+<div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div>
+<div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;        {</div>
+<div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;            prevItem-&gt;pNext = newItem;</div>
+<div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;        }</div>
+<div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;        {</div>
+<div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
+<div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;            m_pFront = newItem;</div>
+<div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;        }</div>
+<div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;    }</div>
+<div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;        <span class="keywordflow">return</span> PushBack();</div>
+<div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;}</div>
+<div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160; </div>
+<div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div>
+<div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;{</div>
+<div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;    {</div>
+<div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div>
+<div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;        newItem-&gt;pNext = nextItem;</div>
+<div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;        newItem-&gt;pPrev = pItem;</div>
+<div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;        pItem-&gt;pNext = newItem;</div>
+<div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div>
+<div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;        {</div>
+<div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;            nextItem-&gt;pPrev = newItem;</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="keywordflow">else</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;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
+<div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;            m_pBack = newItem;</div>
+<div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;        }</div>
+<div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    }</div>
+<div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;        <span class="keywordflow">return</span> PushFront();</div>
+<div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;}</div>
+<div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160; </div>
+<div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04906"></a><span class="lineno"> 4906</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="l04907"></a><span class="lineno"> 4907</span>&#160;{</div>
+<div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div>
+<div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;    newItem-&gt;Value = value;</div>
+<div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;}</div>
+<div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160; </div>
+<div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04914"></a><span class="lineno"> 4914</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="l04915"></a><span class="lineno"> 4915</span>&#160;{</div>
+<div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div>
+<div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;    newItem-&gt;Value = value;</div>
+<div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;}</div>
+<div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160; </div>
+<div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div>
+<div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;<span class="keyword">class </span>VmaList</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;    VMA_CLASS_NO_COPY(VmaList)</div>
+<div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;    <span class="keyword">class </span>iterator</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">public</span>:</div>
+<div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;        iterator() :</div>
+<div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;            m_pList(VMA_NULL),</div>
+<div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;            m_pItem(VMA_NULL)</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;        }</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;        T&amp; operator*()<span class="keyword"> const</span></div>
+<div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div>
+<div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;        }</div>
+<div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div>
+<div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
+<div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;        }</div>
+<div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160; </div>
+<div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;        iterator&amp; operator++()</div>
+<div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;        {</div>
+<div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
+<div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;        }</div>
+<div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;        iterator&amp; operator--()</div>
+<div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;        {</div>
+<div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
+<div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;            {</div>
+<div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
+<div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;            }</div>
+<div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;            {</div>
+<div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
+<div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
+<div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;            }</div>
+<div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;        }</div>
+<div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160; </div>
+<div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;        {</div>
+<div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;            ++*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;        }</div>
+<div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;        {</div>
+<div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;            --*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;        }</div>
+<div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160; </div>
+<div class="line"><a name="l04979"></a><span class="lineno"> 4979</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="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
+<div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;        }</div>
+<div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;        <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="l04985"></a><span class="lineno"> 4985</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div>
+<div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;        }</div>
+<div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;        </div>
+<div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div>
+<div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div>
+<div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160; </div>
+<div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div>
+<div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;            m_pList(pList),</div>
+<div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;            m_pItem(pItem)</div>
+<div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;        {</div>
+<div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;        }</div>
+<div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160; </div>
+<div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
+<div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;    };</div>
+<div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160; </div>
+<div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;    <span class="keyword">class </span>const_iterator</div>
+<div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    {</div>
+<div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;        const_iterator() :</div>
+<div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;            m_pList(VMA_NULL),</div>
+<div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;            m_pItem(VMA_NULL)</div>
+<div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;        {</div>
+<div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;        }</div>
+<div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160; </div>
+<div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div>
+<div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;            m_pList(src.m_pList),</div>
+<div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;            m_pItem(src.m_pItem)</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;        }</div>
+<div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;        </div>
+<div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</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">const</span> T* operator-&gt;()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
+<div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;        }</div>
+<div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160; </div>
+<div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;        const_iterator&amp; operator++()</div>
+<div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;        {</div>
+<div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
+<div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;        const_iterator&amp; operator--()</div>
+<div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;        {</div>
+<div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
+<div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;            {</div>
+<div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;            }</div>
+<div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;            {</div>
+<div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
+<div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
+<div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;            }</div>
+<div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;        }</div>
+<div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160; </div>
+<div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</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;            const_iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;            ++*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;        }</div>
+<div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;        {</div>
+<div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;            --*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;        }</div>
+<div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160; </div>
+<div class="line"><a name="l05062"></a><span class="lineno"> 5062</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="l05063"></a><span class="lineno"> 5063</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
+<div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;        }</div>
+<div class="line"><a name="l05067"></a><span class="lineno"> 5067</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="l05068"></a><span class="lineno"> 5068</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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;        </div>
+<div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l05074"></a><span class="lineno"> 5074</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="l05075"></a><span class="lineno"> 5075</span>&#160;            m_pList(pList),</div>
+<div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;            m_pItem(pItem)</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;        }</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;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div>
+<div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div>
+<div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160; </div>
+<div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
+<div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;    };</div>
+<div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160; </div>
+<div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div>
+<div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160; </div>
+<div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;    <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="l05089"></a><span class="lineno"> 5089</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="l05090"></a><span class="lineno"> 5090</span>&#160; </div>
+<div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div>
+<div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div>
+<div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160; </div>
+<div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;    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="l05095"></a><span class="lineno"> 5095</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="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">void</span> clear() { m_RawList.Clear(); }</div>
+<div class="line"><a name="l05098"></a><span class="lineno"> 5098</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="l05099"></a><span class="lineno"> 5099</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div>
+<div class="line"><a name="l05100"></a><span class="lineno"> 5100</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="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">private</span>:</div>
+<div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div>
+<div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;};</div>
+<div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160; </div>
+<div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160; </div>
+<div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;<span class="comment">// class VmaMap</span></div>
+<div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160; </div>
+<div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;<span class="comment">// Unused in this version.</span></div>
+<div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;<span class="preprocessor">#if 0</span></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;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></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="preprocessor">#define VmaPair std::pair</span></div>
+<div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160; </div>
+<div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div>
+<div class="line"><a name="l05119"></a><span class="lineno"> 5119</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="l05120"></a><span class="lineno"> 5120</span>&#160; </div>
+<div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160; </div>
+<div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div>
+<div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;<span class="keyword">struct </span>VmaPair</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;    T1 first;</div>
+<div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;    T2 second;</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;    VmaPair() : first(), second() { }</div>
+<div class="line"><a name="l05130"></a><span class="lineno"> 5130</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="l05131"></a><span class="lineno"> 5131</span>&#160;};</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="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div>
+<div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div>
+<div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05136"></a><span class="lineno"> 5136</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="l05137"></a><span class="lineno"> 5137</span>&#160;<span class="keyword">class </span>VmaMap</div>
+<div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;{</div>
+<div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div>
+<div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div>
+<div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160; </div>
+<div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</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;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div>
+<div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div>
+<div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160; </div>
+<div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div>
+<div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div>
+<div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</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">private</span>:</div>
+<div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div>
+<div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;};</div>
+<div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160; </div>
+<div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div>
+<div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160; </div>
+<div class="line"><a name="l05158"></a><span class="lineno"> 5158</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="l05159"></a><span class="lineno"> 5159</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</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="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="l05162"></a><span class="lineno"> 5162</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div>
+<div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;    }</div>
+<div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;    <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="l05166"></a><span class="lineno"> 5166</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div>
+<div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;    }</div>
+<div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;};</div>
+<div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160; </div>
+<div class="line"><a name="l05171"></a><span class="lineno"> 5171</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="l05172"></a><span class="lineno"> 5172</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="l05173"></a><span class="lineno"> 5173</span>&#160;{</div>
+<div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;        m_Vector.data(),</div>
+<div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
+<div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;        pair,</div>
+<div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div>
+<div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div>
+<div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;}</div>
+<div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160; </div>
+<div class="line"><a name="l05182"></a><span class="lineno"> 5182</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="l05183"></a><span class="lineno"> 5183</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="l05184"></a><span class="lineno"> 5184</span>&#160;{</div>
+<div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;        m_Vector.data(),</div>
+<div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
+<div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;        key,</div>
+<div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div>
+<div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div>
+<div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;    {</div>
+<div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;        <span class="keywordflow">return</span> it;</div>
+<div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;    }</div>
+<div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;    {</div>
+<div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div>
+<div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;    }</div>
+<div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;}</div>
+<div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160; </div>
+<div class="line"><a name="l05200"></a><span class="lineno"> 5200</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="l05201"></a><span class="lineno"> 5201</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div>
+<div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;{</div>
+<div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div>
+<div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;}</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;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160; </div>
+<div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;<span class="preprocessor">#endif // #if 0</span></div>
+<div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160; </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">class </span>VmaDeviceMemoryBlock;</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">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</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">struct </span>VmaAllocation_T</div>
+<div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;{</div>
+<div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05219"></a><span class="lineno"> 5219</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="l05220"></a><span class="lineno"> 5220</span>&#160; </div>
+<div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    <span class="keyword">enum</span> FLAGS</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;        FLAG_USER_DATA_STRING = 0x01,</div>
+<div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;    };</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">public</span>:</div>
+<div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div>
+<div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;    {</div>
+<div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;        ALLOCATION_TYPE_NONE,</div>
+<div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;        ALLOCATION_TYPE_BLOCK,</div>
+<div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div>
+<div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;    };</div>
+<div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160; </div>
+<div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;<span class="comment">    This struct is allocated using VmaPoolAllocator.</span></div>
+<div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160; </div>
+<div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;    <span class="keywordtype">void</span> Ctor(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString)</div>
+<div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;    {</div>
+<div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;        m_Alignment = 1;</div>
+<div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;        m_Size = 0;</div>
+<div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;        m_pUserData = VMA_NULL;</div>
+<div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;        m_LastUseFrameIndex = currentFrameIndex;</div>
+<div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_NONE;</div>
+<div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;        m_SuballocationType = (uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN;</div>
+<div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;        m_MapCount = 0;</div>
+<div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;        m_Flags = userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0;</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div>
+<div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;        m_BufferImageUsage = 0;</div>
+<div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;    }</div>
+<div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160; </div>
+<div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;    <span class="keywordtype">void</span> Dtor()</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_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="l05258"></a><span class="lineno"> 5258</span>&#160; </div>
+<div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div>
+<div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div>
+<div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;    }</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;    <span class="keywordtype">void</span> InitBlockAllocation(</div>
+<div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;        VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;        VmaSuballocationType suballocationType,</div>
+<div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;        <span class="keywordtype">bool</span> mapped,</div>
+<div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div>
+<div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
+<div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;        m_Alignment = alignment;</div>
+<div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;        m_Size = size;</div>
+<div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
+<div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
+<div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;        m_BlockAllocation.m_Block = block;</div>
+<div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;        m_BlockAllocation.m_Offset = offset;</div>
+<div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div>
+<div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;    }</div>
+<div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160; </div>
+<div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;    <span class="keywordtype">void</span> InitLost()</div>
+<div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;    {</div>
+<div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
+<div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div>
+<div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;        m_BlockAllocation.m_Offset = 0;</div>
+<div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    }</div>
+<div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160; </div>
+<div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div>
+<div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;        VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;        VkDeviceSize offset); </div>
+<div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160; </div>
+<div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;    <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</div>
+<div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160; </div>
+<div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div>
+<div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div>
+<div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;        uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;        VkDeviceMemory hMemory,</div>
+<div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;        VmaSuballocationType suballocationType,</div>
+<div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div>
+<div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;        VkDeviceSize size)</div>
+<div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;    {</div>
+<div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div>
+<div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;        m_Alignment = 0;</div>
+<div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;        m_Size = size;</div>
+<div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
+<div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
+<div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div>
+<div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div>
+<div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</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; </div>
+<div class="line"><a name="l05321"></a><span class="lineno"> 5321</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="l05322"></a><span class="lineno"> 5322</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div>
+<div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
+<div class="line"><a name="l05324"></a><span class="lineno"> 5324</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="l05325"></a><span class="lineno"> 5325</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="l05326"></a><span class="lineno"> 5326</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="l05327"></a><span class="lineno"> 5327</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div>
+<div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160; </div>
+<div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div>
+<div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;    }</div>
+<div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05337"></a><span class="lineno"> 5337</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="l05338"></a><span class="lineno"> 5338</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;    </div>
+<div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div>
+<div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;    }</div>
+<div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div>
+<div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;    {</div>
+<div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div>
+<div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;    }</div>
+<div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div>
+<div class="line"><a name="l05351"></a><span class="lineno"> 5351</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="l05352"></a><span class="lineno"> 5352</span>&#160;<span class="comment">    - Else, returns false.</span></div>
+<div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;<span class="comment">    </span></div>
+<div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div>
+<div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div>
+<div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div>
+<div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div>
+<div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div>
+<div class="line"><a name="l05367"></a><span class="lineno"> 5367</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="l05368"></a><span class="lineno"> 5368</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;    }</div>
+<div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160; </div>
+<div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div>
+<div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div>
+<div class="line"><a name="l05374"></a><span class="lineno"> 5374</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="l05375"></a><span class="lineno"> 5375</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="l05376"></a><span class="lineno"> 5376</span>&#160; </div>
+<div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div>
+<div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div>
+<div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160; </div>
+<div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</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;        VMA_ASSERT(m_BufferImageUsage == 0);</div>
+<div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;        m_BufferImageUsage = bufferImageUsage;</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;    <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="l05388"></a><span class="lineno"> 5388</span>&#160;<span class="preprocessor">#endif</span></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="keyword">private</span>:</div>
+<div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;    VkDeviceSize m_Alignment;</div>
+<div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;    VkDeviceSize m_Size;</div>
+<div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div>
+<div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div>
+<div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div>
+<div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div>
+<div class="line"><a name="l05397"></a><span class="lineno"> 5397</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="l05398"></a><span class="lineno"> 5398</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div>
+<div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;    uint8_t m_MapCount;</div>
+<div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></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="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div>
+<div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;    {</div>
+<div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div>
+<div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;        VkDeviceSize m_Offset;</div>
+<div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div>
+<div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;    };</div>
+<div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160; </div>
+<div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
+<div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</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;        uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;        VkDeviceMemory m_hMemory;</div>
+<div class="line"><a name="l05415"></a><span class="lineno"> 5415</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="l05416"></a><span class="lineno"> 5416</span>&#160;    };</div>
+<div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160; </div>
+<div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    <span class="keyword">union</span></div>
+<div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    {</div>
+<div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;        BlockAllocation m_BlockAllocation;</div>
+<div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
+<div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div>
+<div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    };</div>
+<div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160; </div>
+<div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;    uint32_t m_CreationFrameIndex;</div>
+<div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div>
+<div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;<span class="preprocessor">#endif</span></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="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;};</div>
+<div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160; </div>
+<div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div>
+<div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;<span class="comment">allocated memory block or free.</span></div>
+<div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div>
+<div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;{</div>
+<div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;    VkDeviceSize offset;</div>
+<div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;    VkDeviceSize size;</div>
+<div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div>
+<div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;    VmaSuballocationType type;</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; </div>
+<div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;<span class="comment">// Comparator for offsets.</span></div>
+<div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</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;    <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="l05450"></a><span class="lineno"> 5450</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</div>
+<div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;    }</div>
+<div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;};</div>
+<div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetGreater</div>
+<div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;{</div>
+<div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;    <span class="keywordtype">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="l05457"></a><span class="lineno"> 5457</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</div>
+<div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;    }</div>
+<div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;};</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="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</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="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div>
+<div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div>
+<div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160; </div>
+<div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;<span class="keyword">enum class</span> VmaAllocationRequestType</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;    Normal,</div>
+<div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;    <span class="comment">// Used by &quot;Linear&quot; algorithm.</span></div>
+<div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;    UpperAddress,</div>
+<div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;    EndOf1st,</div>
+<div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;    EndOf2nd,</div>
+<div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;};</div>
+<div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160; </div>
+<div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div>
+<div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div>
+<div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div>
+<div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div>
+<div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div>
+<div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div>
+<div class="line"><a name="l05486"></a><span class="lineno"> 5486</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="l05487"></a><span class="lineno"> 5487</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div>
+<div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</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;    VkDeviceSize offset;</div>
+<div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div>
+<div class="line"><a name="l05493"></a><span class="lineno"> 5493</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="l05494"></a><span class="lineno"> 5494</span>&#160;    VmaSuballocationList::iterator item;</div>
+<div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div>
+<div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;    <span class="keywordtype">void</span>* customData;</div>
+<div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;    VmaAllocationRequestType type;</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;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</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;};</div>
+<div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160; </div>
+<div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div>
+<div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div>
+<div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</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;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div>
+<div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</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;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
+<div class="line"><a name="l05517"></a><span class="lineno"> 5517</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="l05518"></a><span class="lineno"> 5518</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
+<div class="line"><a name="l05519"></a><span class="lineno"> 5519</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="l05520"></a><span class="lineno"> 5520</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div>
+<div class="line"><a name="l05523"></a><span class="lineno"> 5523</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="l05524"></a><span class="lineno"> 5524</span>&#160; </div>
+<div class="line"><a name="l05525"></a><span class="lineno"> 5525</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="l05526"></a><span class="lineno"> 5526</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div>
+<div class="line"><a name="l05527"></a><span class="lineno"> 5527</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="l05528"></a><span class="lineno"> 5528</span>&#160; </div>
+<div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05530"></a><span class="lineno"> 5530</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="l05531"></a><span class="lineno"> 5531</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160; </div>
+<div class="line"><a name="l05533"></a><span class="lineno"> 5533</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="l05534"></a><span class="lineno"> 5534</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div>
+<div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;    <span class="comment">// If failed, returns false.</span></div>
+<div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;        <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div>
+<div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</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="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div>
+<div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160; </div>
+<div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div>
+<div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div>
+<div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160; </div>
+<div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div>
+<div class="line"><a name="l05566"></a><span class="lineno"> 5566</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="l05567"></a><span class="lineno"> 5567</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div>
+<div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160; </div>
+<div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l05570"></a><span class="lineno"> 5570</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="l05571"></a><span class="lineno"> 5571</span>&#160; </div>
+<div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;        VkDeviceSize unusedBytes,</div>
+<div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05583"></a><span class="lineno"> 5583</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="l05584"></a><span class="lineno"> 5584</span>&#160;<span class="preprocessor">#endif</span></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="keyword">private</span>:</div>
+<div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;    VkDeviceSize m_Size;</div>
+<div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</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;<span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div>
+<div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot; #cond); \</span></div>
+<div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;<span class="preprocessor">        return false; \</span></div>
+<div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;<span class="preprocessor">    } } while(false)</span></div>
+<div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160; </div>
+<div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div>
+<div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div>
+<div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05605"></a><span class="lineno"> 5605</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="l05606"></a><span class="lineno"> 5606</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="l05607"></a><span class="lineno"> 5607</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</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;    <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="l05611"></a><span class="lineno"> 5611</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="l05612"></a><span class="lineno"> 5612</span>&#160; </div>
+<div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05614"></a><span class="lineno"> 5614</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="l05615"></a><span class="lineno"> 5615</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160; </div>
+<div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160; </div>
+<div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div>
+<div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160; </div>
+<div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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">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="l05645"></a><span class="lineno"> 5645</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
+<div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160; </div>
+<div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;    <span class="comment">// For defragmentation</span></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;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div>
+<div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;        VmaSuballocationType&amp; inOutPrevSuballocType) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160; </div>
+<div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
+<div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div>
+<div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160; </div>
+<div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;    uint32_t m_FreeCount;</div>
+<div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
+<div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;    VmaSuballocationList m_Suballocations;</div>
+<div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div>
+<div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div>
+<div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div>
+<div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160; </div>
+<div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160; </div>
+<div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div>
+<div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div>
+<div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div>
+<div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div>
+<div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;        VkDeviceSize* pOffset,</div>
+<div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
+<div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;        VkDeviceSize* pSumFreeSize,</div>
+<div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05682"></a><span class="lineno"> 5682</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="l05683"></a><span class="lineno"> 5683</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div>
+<div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div>
+<div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div>
+<div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div>
+<div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div>
+<div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
+<div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div>
+<div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
+<div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;};</div>
+<div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160; </div>
+<div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div>
+<div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div>
+<div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div>
+<div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
+<div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
+<div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
+<div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div>
+<div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
+<div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
+<div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
+<div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;{</div>
+<div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div>
+<div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div>
+<div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05783"></a><span class="lineno"> 5783</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="l05784"></a><span class="lineno"> 5784</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="l05785"></a><span class="lineno"> 5785</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05786"></a><span class="lineno"> 5786</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="l05787"></a><span class="lineno"> 5787</span>&#160; </div>
+<div class="line"><a name="l05788"></a><span class="lineno"> 5788</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="l05789"></a><span class="lineno"> 5789</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="l05790"></a><span class="lineno"> 5790</span>&#160; </div>
+<div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05792"></a><span class="lineno"> 5792</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="l05793"></a><span class="lineno"> 5793</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160; </div>
+<div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160; </div>
+<div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160; </div>
+<div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
+<div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160; </div>
+<div class="line"><a name="l05814"></a><span class="lineno"> 5814</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="l05815"></a><span class="lineno"> 5815</span>&#160; </div>
+<div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160; </div>
+<div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;    <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="l05823"></a><span class="lineno"> 5823</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
+<div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160; </div>
+<div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div>
+<div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div>
+<div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div>
+<div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div>
+<div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div>
+<div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</div>
+<div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160; </div>
+<div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</div>
+<div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;    {</div>
+<div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;        SECOND_VECTOR_EMPTY,</div>
+<div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l05839"></a><span class="lineno"> 5839</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="l05840"></a><span class="lineno"> 5840</span>&#160;<span class="comment">        all have smaller offset.</span></div>
+<div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div>
+<div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div>
+<div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div>
+<div class="line"><a name="l05846"></a><span class="lineno"> 5846</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="l05847"></a><span class="lineno"> 5847</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</div>
+<div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;    };</div>
+<div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160; </div>
+<div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
+<div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div>
+<div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;    uint32_t m_1stVectorIndex;</div>
+<div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</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;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div>
+<div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div>
+<div class="line"><a name="l05858"></a><span class="lineno"> 5858</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="l05859"></a><span class="lineno"> 5859</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="l05860"></a><span class="lineno"> 5860</span>&#160;    </div>
+<div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;    <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div>
+<div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l05863"></a><span class="lineno"> 5863</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="l05864"></a><span class="lineno"> 5864</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div>
+<div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div>
+<div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160; </div>
+<div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</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="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;};</div>
+<div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160; </div>
+<div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div>
+<div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div>
+<div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div>
+<div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div>
+<div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;<span class="comment">  It is repoted as separate, unused range, not available for allocations.</span></div>
+<div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div>
+<div class="line"><a name="l05901"></a><span class="lineno"> 5901</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="l05902"></a><span class="lineno"> 5902</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="l05903"></a><span class="lineno"> 5903</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;{</div>
+<div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div>
+<div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div>
+<div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
+<div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160; </div>
+<div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05913"></a><span class="lineno"> 5913</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="l05914"></a><span class="lineno"> 5914</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="l05915"></a><span class="lineno"> 5915</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l05916"></a><span class="lineno"> 5916</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="l05917"></a><span class="lineno"> 5917</span>&#160; </div>
+<div class="line"><a name="l05918"></a><span class="lineno"> 5918</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="l05919"></a><span class="lineno"> 5919</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="l05920"></a><span class="lineno"> 5920</span>&#160; </div>
+<div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l05922"></a><span class="lineno"> 5922</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="l05923"></a><span class="lineno"> 5923</span>&#160;<span class="preprocessor">#endif</span></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">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160; </div>
+<div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160; </div>
+<div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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="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="l05945"></a><span class="lineno"> 5945</span>&#160; </div>
+<div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160; </div>
+<div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;    <span class="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="l05953"></a><span class="lineno"> 5953</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="l05954"></a><span class="lineno"> 5954</span>&#160; </div>
+<div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div>
+<div class="line"><a name="l05957"></a><span class="lineno"> 5957</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="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">struct </span>ValidationContext</div>
+<div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;    {</div>
+<div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        <span class="keywordtype">size_t</span> calculatedAllocationCount;</div>
+<div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div>
+<div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;        VkDeviceSize calculatedSumFreeSize;</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;        ValidationContext() :</div>
+<div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;            calculatedAllocationCount(0),</div>
+<div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;            calculatedFreeCount(0),</div>
+<div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;            calculatedSumFreeSize(0) { }</div>
+<div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;    };</div>
+<div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160; </div>
+<div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;    <span class="keyword">struct </span>Node</div>
+<div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;    {</div>
+<div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;        VkDeviceSize offset;</div>
+<div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;        <span class="keyword">enum</span> TYPE</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;            TYPE_FREE,</div>
+<div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;            TYPE_ALLOCATION,</div>
+<div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;            TYPE_SPLIT,</div>
+<div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;            TYPE_COUNT</div>
+<div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;        } type;</div>
+<div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;        Node* parent;</div>
+<div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;        Node* buddy;</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;        <span class="keyword">union</span></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="keyword">struct</span></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;                Node* prev;</div>
+<div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;                Node* next;</div>
+<div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;            } free;</div>
+<div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;            <span class="keyword">struct</span></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;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;            } allocation;</div>
+<div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;            <span class="keyword">struct</span></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;                Node* leftChild;</div>
+<div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;            } split;</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;    };</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="comment">// Size of the memory block aligned down to a power of two.</span></div>
+<div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;    VkDeviceSize m_UsableSize;</div>
+<div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;    uint32_t m_LevelCount;</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;    Node* m_Root;</div>
+<div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;    <span class="keyword">struct </span>{</div>
+<div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;        Node* front;</div>
+<div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;        Node* back;</div>
+<div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;    } m_FreeList[MAX_LEVELS];</div>
+<div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div>
+<div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div>
+<div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div>
+<div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div>
+<div class="line"><a name="l06015"></a><span class="lineno"> 6015</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="l06016"></a><span class="lineno"> 6016</span>&#160;    VkDeviceSize m_SumFreeSize;</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;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div>
+<div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div>
+<div class="line"><a name="l06020"></a><span class="lineno"> 6020</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="l06021"></a><span class="lineno"> 6021</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06022"></a><span class="lineno"> 6022</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="l06023"></a><span class="lineno"> 6023</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div>
+<div class="line"><a name="l06024"></a><span class="lineno"> 6024</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="l06025"></a><span class="lineno"> 6025</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="l06026"></a><span class="lineno"> 6026</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div>
+<div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
+<div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div>
+<div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div>
+<div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div>
+<div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
+<div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div>
+<div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06036"></a><span class="lineno"> 6036</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="l06037"></a><span class="lineno"> 6037</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;};</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="comment">/*</span></div>
+<div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div>
+<div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div>
+<div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div>
+<div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</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;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div>
+<div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;    VmaBlockMetadata* m_pMetadata;</div>
+<div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160; </div>
+<div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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;    ~VmaDeviceMemoryBlock()</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;        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="l06057"></a><span class="lineno"> 6057</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    }</div>
+<div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160; </div>
+<div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;    <span class="comment">// Always call after construction.</span></div>
+<div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;    <span class="keywordtype">void</span> Init(</div>
+<div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;        uint32_t newMemoryTypeIndex,</div>
+<div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;        VkDeviceMemory newMemory,</div>
+<div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;        VkDeviceSize newSize,</div>
+<div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div>
+<div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;        uint32_t algorithm);</div>
+<div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;    <span class="comment">// Always call before destruction.</span></div>
+<div class="line"><a name="l06070"></a><span class="lineno"> 6070</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="l06071"></a><span class="lineno"> 6071</span>&#160;    </div>
+<div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
+<div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div>
+<div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
+<div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
+<div class="line"><a name="l06076"></a><span class="lineno"> 6076</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="l06077"></a><span class="lineno"> 6077</span>&#160; </div>
+<div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
+<div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160; </div>
+<div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160; </div>
+<div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;    <span class="comment">// ppData can be null.</span></div>
+<div class="line"><a name="l06084"></a><span class="lineno"> 6084</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="l06085"></a><span class="lineno"> 6085</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="l06086"></a><span class="lineno"> 6086</span>&#160; </div>
+<div class="line"><a name="l06087"></a><span class="lineno"> 6087</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="l06088"></a><span class="lineno"> 6088</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="l06089"></a><span class="lineno"> 6089</span>&#160; </div>
+<div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;    VkResult BindBufferMemory(</div>
+<div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;    VkResult BindImageMemory(</div>
+<div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</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;    <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div>
+<div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;    uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    uint32_t m_Id;</div>
+<div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;    VkDeviceMemory m_hMemory;</div>
+<div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160; </div>
+<div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l06110"></a><span class="lineno"> 6110</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="l06111"></a><span class="lineno"> 6111</span>&#160;<span class="comment">    Also protects m_MapCount, m_pMappedData.</span></div>
+<div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;<span class="comment">    Allocations, deallocations, any change in m_pMetadata is protected by parent&#39;s VmaBlockVector::m_Mutex.</span></div>
+<div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;    VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;    uint32_t m_MapCount;</div>
+<div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</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; </div>
+<div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;<span class="keyword">struct </span>VmaPointerLess</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;    <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="l06122"></a><span class="lineno"> 6122</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div>
+<div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;    }</div>
+<div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;};</div>
+<div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160; </div>
+<div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;<span class="keyword">struct </span>VmaDefragmentationMove</div>
+<div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;{</div>
+<div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex;</div>
+<div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    <span class="keywordtype">size_t</span> dstBlockIndex;</div>
+<div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;    VkDeviceSize srcOffset;</div>
+<div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;    VkDeviceSize dstOffset;</div>
+<div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;    VkDeviceSize size;</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; </div>
+<div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm;</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;<span class="comment">/*</span></div>
+<div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div>
+<div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;<span class="comment">Vulkan memory type.</span></div>
+<div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div>
+<div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;<span class="keyword">struct </span>VmaBlockVector</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;    VMA_CLASS_NO_COPY(VmaBlockVector)</div>
+<div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;    VmaBlockVector(</div>
+<div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;        uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;        VkDeviceSize preferredBlockSize,</div>
+<div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div>
+<div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div>
+<div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;        <span class="keywordtype">bool</span> isCustomPool,</div>
+<div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div>
+<div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;        uint32_t algorithm);</div>
+<div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;    ~VmaBlockVector();</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;    VkResult CreateMinBlocks();</div>
+<div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160; </div>
+<div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
+<div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
+<div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div>
+<div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div>
+<div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div>
+<div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div>
+<div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160; </div>
+<div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</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;    <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="l06174"></a><span class="lineno"> 6174</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160; </div>
+<div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;    VkResult Allocate(</div>
+<div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l06180"></a><span class="lineno"> 6180</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="l06181"></a><span class="lineno"> 6181</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160; </div>
+<div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div>
+<div class="line"><a name="l06188"></a><span class="lineno"> 6188</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="l06189"></a><span class="lineno"> 6189</span>&#160; </div>
+<div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
+<div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160; </div>
+<div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
+<div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
+<div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;    VkResult CheckCorruption();</div>
+<div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160; </div>
+<div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;    <span class="comment">// Saves results in pCtx-&gt;res.</span></div>
+<div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;    <span class="keywordtype">void</span> Defragment(</div>
+<div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;        VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;        VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;        VkCommandBuffer commandBuffer);</div>
+<div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;    <span class="keywordtype">void</span> DefragmentationEnd(</div>
+<div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
+<div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160; </div>
+<div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;    <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div>
+<div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160; </div>
+<div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;    <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div>
+<div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;    VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div>
+<div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;    <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160; </div>
+<div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
+<div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160; </div>
+<div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
+<div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div>
+<div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div>
+<div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div>
+<div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div>
+<div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div>
+<div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div>
+<div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div>
+<div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div>
+<div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div>
+<div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div>
+<div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div>
+<div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div>
+<div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div>
+<div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;    VMA_RW_MUTEX m_Mutex;</div>
+<div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div>
+<div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div>
+<div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;    uint32_t m_NextBlockId;</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;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160; </div>
+<div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div>
+<div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div>
+<div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160; </div>
+<div class="line"><a name="l06246"></a><span class="lineno"> 6246</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="l06247"></a><span class="lineno"> 6247</span>&#160;    <span class="comment">// after this call.</span></div>
+<div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</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;    VkResult AllocatePage(</div>
+<div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l06254"></a><span class="lineno"> 6254</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="l06255"></a><span class="lineno"> 6255</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div>
+<div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;    VkResult AllocateFromBlock(</div>
+<div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div>
+<div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
+<div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160; </div>
+<div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</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="comment">// Saves result to pCtx-&gt;res.</span></div>
+<div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div>
+<div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves);</div>
+<div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div>
+<div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div>
+<div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;        VkCommandBuffer commandBuffer);</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;    <span class="comment">/*</span></div>
+<div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;<span class="comment">    Used during defragmentation. pDefragmentationStats is optional. It&#39;s in/out</span></div>
+<div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;<span class="comment">    - updated with new data.</span></div>
+<div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;    <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</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; </div>
+<div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;<span class="keyword">struct </span>VmaPool_T</div>
+<div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;{</div>
+<div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div>
+<div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;    VmaBlockVector m_BlockVector;</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;    VmaPool_T(</div>
+<div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06297"></a><span class="lineno"> 6297</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="l06298"></a><span class="lineno"> 6298</span>&#160;        VkDeviceSize preferredBlockSize);</div>
+<div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;    ~VmaPool_T();</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;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
+<div class="line"><a name="l06302"></a><span class="lineno"> 6302</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="l06303"></a><span class="lineno"> 6303</span>&#160; </div>
+<div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div>
+<div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160; </div>
+<div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;    uint32_t m_Id;</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; </div>
+<div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;<span class="comment">Performs defragmentation:</span></div>
+<div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;<span class="comment">- Updates `pBlockVector-&gt;m_pMetadata`.</span></div>
+<div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;<span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div>
+<div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;<span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div>
+<div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm</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;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div>
+<div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;    VmaDefragmentationAlgorithm(</div>
+<div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;        uint32_t currentFrameIndex) :</div>
+<div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;        m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;        m_pBlockVector(pBlockVector),</div>
+<div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;        m_CurrentFrameIndex(currentFrameIndex)</div>
+<div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;    {</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="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</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;    }</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;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div>
+<div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</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;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;        uint32_t maxAllocationsToMove) = 0;</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="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160; </div>
+<div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div>
+<div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
+<div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div>
+<div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160; </div>
+<div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;    <span class="keyword">struct </span>AllocationInfo</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;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div>
+<div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;        VkBool32* m_pChanged;</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;        AllocationInfo() :</div>
+<div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div>
+<div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;            m_pChanged(VMA_NULL)</div>
+<div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;        {</div>
+<div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;        }</div>
+<div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;        AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div>
+<div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;            m_hAllocation(hAlloc),</div>
+<div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;            m_pChanged(pChanged)</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;        }</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;};</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="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</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;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div>
+<div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;    VmaDefragmentationAlgorithm_Generic(</div>
+<div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
+<div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</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;    <span class="keyword">virtual</span> <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="l06382"></a><span class="lineno"> 6382</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</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;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;        uint32_t maxAllocationsToMove);</div>
+<div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160; </div>
+<div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
+<div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</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="keyword">private</span>:</div>
+<div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;    uint32_t m_AllocationCount;</div>
+<div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</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;    VkDeviceSize m_BytesMoved;</div>
+<div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;    uint32_t m_AllocationsMoved;</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="keyword">struct </span>AllocationInfoSizeGreater</div>
+<div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;    {</div>
+<div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;        <span class="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="l06402"></a><span class="lineno"> 6402</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</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;    };</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="keyword">struct </span>AllocationInfoOffsetGreater</div>
+<div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;    {</div>
+<div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;        <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="l06410"></a><span class="lineno"> 6410</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetOffset() &gt; rhs.m_hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;        }</div>
+<div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;    };</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;    <span class="keyword">struct </span>BlockInfo</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">size_t</span> m_OriginalBlockIndex;</div>
+<div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div>
+<div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div>
+<div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div>
+<div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160; </div>
+<div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;            m_OriginalBlockIndex(SIZE_MAX),</div>
+<div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;            m_pBlock(VMA_NULL),</div>
+<div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;            m_HasNonMovableAllocations(true),</div>
+<div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;            m_Allocations(pAllocationCallbacks)</div>
+<div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;        {</div>
+<div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;        }</div>
+<div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160; </div>
+<div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div>
+<div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;        {</div>
+<div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;            <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="l06433"></a><span class="lineno"> 6433</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div>
+<div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</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">void</span> SortAllocationsBySizeDescending()</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_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</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; </div>
+<div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</div>
+<div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;        {</div>
+<div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</div>
+<div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;        }</div>
+<div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;    };</div>
+<div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160; </div>
+<div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</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;        <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="l06451"></a><span class="lineno"> 6451</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div>
+<div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;        }</div>
+<div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;        <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="l06455"></a><span class="lineno"> 6455</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div>
+<div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;        }</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; </div>
+<div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div>
+<div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div>
+<div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</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="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="l06465"></a><span class="lineno"> 6465</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</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;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;            }</div>
+<div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</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;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="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="l06475"></a><span class="lineno"> 6475</span>&#160;            {</div>
+<div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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">return</span> <span class="keyword">false</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; </div>
+<div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div>
+<div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;    BlockInfoVector m_Blocks;</div>
+<div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160; </div>
+<div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;    VkResult DefragmentRound(</div>
+<div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;        uint32_t maxAllocationsToMove);</div>
+<div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160; </div>
+<div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;    <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160; </div>
+<div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div>
+<div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
+<div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</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; </div>
+<div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div>
+<div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;{</div>
+<div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div>
+<div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;    VmaDefragmentationAlgorithm_Fast(</div>
+<div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
+<div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div>
+<div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160; </div>
+<div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div>
+<div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
+<div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160; </div>
+<div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;        uint32_t maxAllocationsToMove);</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="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
+<div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</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="keyword">private</span>:</div>
+<div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;    <span class="keyword">struct </span>BlockInfo</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;        <span class="keywordtype">size_t</span> origBlockIndex;</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;    <span class="keyword">class </span>FreeSpaceDatabase</div>
+<div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;    {</div>
+<div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;        FreeSpaceDatabase()</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;            FreeSpace s = {};</div>
+<div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;            s.blockInfoIndex = SIZE_MAX;</div>
+<div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
+<div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;            {</div>
+<div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;                m_FreeSpaces[i] = s;</div>
+<div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;            }</div>
+<div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;        }</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> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;        {</div>
+<div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;            <span class="keywordflow">if</span>(size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;            {</div>
+<div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;                <span class="keywordflow">return</span>;</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="comment">// Find first invalid or the smallest structure.</span></div>
+<div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
+<div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</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="comment">// Empty structure.</span></div>
+<div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</div>
+<div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;                {</div>
+<div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;                    bestIndex = i;</div>
+<div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;                    <span class="keywordflow">break</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;                <span class="keywordflow">if</span>(m_FreeSpaces[i].size &lt; size &amp;&amp;</div>
+<div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;                    (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size &gt; m_FreeSpaces[i].size))</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;                    bestIndex = i;</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; </div>
+<div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</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;                m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div>
+<div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;                m_FreeSpaces[bestIndex].offset = offset;</div>
+<div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;                m_FreeSpaces[bestIndex].size = size;</div>
+<div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;            }</div>
+<div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;        }</div>
+<div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160; </div>
+<div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div>
+<div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;            <span class="keywordtype">size_t</span>&amp; outBlockInfoIndex, VkDeviceSize&amp; outDstOffset)</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;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
+<div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;            VkDeviceSize bestFreeSpaceAfter = 0;</div>
+<div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</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;                <span class="comment">// Structure is valid.</span></div>
+<div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</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;                    <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div>
+<div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;                    <span class="comment">// Allocation fits into this structure.</span></div>
+<div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;                    <span class="keywordflow">if</span>(dstOffset + size &lt;= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div>
+<div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;                    {</div>
+<div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;                        <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div>
+<div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;                            (dstOffset + size);</div>
+<div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;                        <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter &gt; bestFreeSpaceAfter)</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;                            bestIndex = i;</div>
+<div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;                            bestFreeSpaceAfter = freeSpaceAfter;</div>
+<div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;                        }</div>
+<div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;                    }</div>
+<div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;                }</div>
+<div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;            }</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;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div>
+<div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;            {</div>
+<div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;                outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div>
+<div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;                outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</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>(bestFreeSpaceAfter &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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="comment">// Leave this structure for remaining empty space.</span></div>
+<div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;                    <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div>
+<div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;                    m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div>
+<div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;                    m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div>
+<div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;                }</div>
+<div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;                {</div>
+<div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;                    <span class="comment">// This structure becomes invalid.</span></div>
+<div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;                    m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</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; </div>
+<div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; </div>
+<div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</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="keyword">struct </span>FreeSpace</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;            <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div>
+<div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;            VkDeviceSize offset;</div>
+<div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;            VkDeviceSize size;</div>
+<div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;        } m_FreeSpaces[MAX_COUNT];</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; </div>
+<div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</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;    uint32_t m_AllocationCount;</div>
+<div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</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;    VkDeviceSize m_BytesMoved;</div>
+<div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;    uint32_t m_AllocationsMoved;</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;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt; m_BlockInfos;</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;    <span class="keywordtype">void</span> PreprocessMetadata();</div>
+<div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;    <span class="keywordtype">void</span> PostprocessMetadata();</div>
+<div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;    <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc);</div>
+<div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;};</div>
+<div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160; </div>
+<div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;<span class="keyword">struct </span>VmaBlockDefragmentationContext</div>
+<div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;{</div>
+<div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;    <span class="keyword">enum</span> BLOCK_FLAG</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;        BLOCK_FLAG_USED = 0x00000001,</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;    uint32_t flags;</div>
+<div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;    VkBuffer hBuffer;</div>
+<div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;};</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;<span class="keyword">class </span>VmaBlockVectorDefragmentationContext</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;    VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div>
+<div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;    VkResult res;</div>
+<div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;    <span class="keywordtype">bool</span> mutexLocked;</div>
+<div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;    VmaVector&lt; VmaBlockDefragmentationContext, VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt; &gt; blockContexts;</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;    VmaBlockVectorDefragmentationContext(</div>
+<div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div>
+<div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;        uint32_t currFrameIndex);</div>
+<div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;    ~VmaBlockVectorDefragmentationContext();</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;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div>
+<div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;    VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div>
+<div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;    VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</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="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div>
+<div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;    <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</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">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported);</div>
+<div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160; </div>
+<div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06680"></a><span class="lineno"> 6680</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="l06681"></a><span class="lineno"> 6681</span>&#160;    <span class="comment">// Null if not from custom pool.</span></div>
+<div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div>
+<div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;    <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool-&gt;m_BlockVector or m_hAllocator-&gt;m_pBlockVectors.</span></div>
+<div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
+<div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
+<div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;    <span class="comment">// Owner of this object.</span></div>
+<div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;    VmaDefragmentationAlgorithm* m_pAlgorithm;</div>
+<div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160; </div>
+<div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;    <span class="keyword">struct </span>AllocInfo</div>
+<div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;    {</div>
+<div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div>
+<div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;        VkBool32* pChanged;</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;    <span class="comment">// Used between constructor and Begin.</span></div>
+<div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;    VmaVector&lt; AllocInfo, VmaStlAllocator&lt;AllocInfo&gt; &gt; m_Allocations;</div>
+<div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
+<div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;};</div>
+<div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160; </div>
+<div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;<span class="keyword">struct </span>VmaDefragmentationContext_T</div>
+<div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;{</div>
+<div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div>
+<div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;    VmaDefragmentationContext_T(</div>
+<div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;        uint32_t currFrameIndex,</div>
+<div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;        uint32_t flags,</div>
+<div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
+<div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;    ~VmaDefragmentationContext_T();</div>
+<div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160; </div>
+<div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;    <span class="keywordtype">void</span> AddPools(uint32_t poolCount, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div>
+<div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;    <span class="keywordtype">void</span> AddAllocations(</div>
+<div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;        uint32_t allocationCount,</div>
+<div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;        VkBool32* pAllocationsChanged);</div>
+<div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160; </div>
+<div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;<span class="comment">    Returns:</span></div>
+<div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;<span class="comment">    - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div>
+<div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;<span class="comment">    - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div>
+<div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;<span class="comment">    - Negative value if error occured and object can be destroyed immediately.</span></div>
+<div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;    VkResult Defragment(</div>
+<div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;        VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;        VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;        VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</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="keyword">private</span>:</div>
+<div class="line"><a name="l06729"></a><span class="lineno"> 6729</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="l06730"></a><span class="lineno"> 6730</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
+<div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    <span class="keyword">const</span> uint32_t m_Flags;</div>
+<div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div>
+<div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
+<div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;    VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
+<div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;    VmaVector&lt; VmaBlockVectorDefragmentationContext*, VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt; &gt; m_CustomPoolContexts;</div>
+<div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;};</div>
+<div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160; </div>
+<div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></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;<span class="keyword">class </span>VmaRecorder</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;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;    VmaRecorder();</div>
+<div class="line"><a name="l06745"></a><span class="lineno"> 6745</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="l06746"></a><span class="lineno"> 6746</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div>
+<div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
+<div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
+<div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
+<div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;        <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled);</div>
+<div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;    ~VmaRecorder();</div>
+<div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160; </div>
+<div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div>
+<div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div>
+<div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div>
+<div class="line"><a name="l06756"></a><span class="lineno"> 6756</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="l06757"></a><span class="lineno"> 6757</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l06758"></a><span class="lineno"> 6758</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="l06759"></a><span class="lineno"> 6759</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l06761"></a><span class="lineno"> 6761</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="l06762"></a><span class="lineno"> 6762</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l06765"></a><span class="lineno"> 6765</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="l06766"></a><span class="lineno"> 6766</span>&#160;        uint64_t allocationCount,</div>
+<div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l06772"></a><span class="lineno"> 6772</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="l06773"></a><span class="lineno"> 6773</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l06778"></a><span class="lineno"> 6778</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="l06779"></a><span class="lineno"> 6779</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;        uint64_t allocationCount,</div>
+<div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div>
+<div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div>
+<div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
+<div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
+<div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
+<div class="line"><a name="l06800"></a><span class="lineno"> 6800</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="l06801"></a><span class="lineno"> 6801</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
+<div class="line"><a name="l06804"></a><span class="lineno"> 6804</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="l06805"></a><span class="lineno"> 6805</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div>
+<div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
+<div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div>
+<div class="line"><a name="l06817"></a><span class="lineno"> 6817</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="l06818"></a><span class="lineno"> 6818</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
+<div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div>
+<div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
+<div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160; </div>
+<div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;    <span class="keyword">struct </span>CallParams</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;        uint32_t threadId;</div>
+<div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;        <span class="keywordtype">double</span> time;</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;    <span class="keyword">class </span>UserDataString</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;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l06832"></a><span class="lineno"> 6832</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="l06833"></a><span class="lineno"> 6833</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="l06834"></a><span class="lineno"> 6834</span>&#160; </div>
+<div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div>
+<div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</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; </div>
+<div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
+<div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div>
+<div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;    FILE* m_File;</div>
+<div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    VMA_MUTEX m_FileMutex;</div>
+<div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;    int64_t m_Freq;</div>
+<div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;    int64_t m_StartCounter;</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;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div>
+<div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160; </div>
+<div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;    <span class="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div>
+<div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</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="keywordflow">if</span>(count)</div>
+<div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;        {</div>
+<div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
+<div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;            <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</div>
+<div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;            {</div>
+<div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;                fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</div>
+<div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;            }</div>
+<div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;        }</div>
+<div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;    }</div>
+<div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160; </div>
+<div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div>
+<div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;    <span class="keywordtype">void</span> Flush();</div>
+<div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;};</div>
+<div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160; </div>
+<div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</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="comment">/*</span></div>
+<div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;<span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div>
+<div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;<span class="keyword">class </span>VmaAllocationObjectAllocator</div>
+<div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;{</div>
+<div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div>
+<div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;    VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</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;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate();</div>
+<div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;    <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div>
+<div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160; </div>
+<div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;    VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;    VmaPoolAllocator&lt;VmaAllocation_T&gt; m_Allocator;</div>
+<div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;};</div>
+<div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160; </div>
+<div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;<span class="keyword">struct </span>VmaCurrentBudgetData</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;    VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;    VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160; </div>
+<div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;    VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;    VMA_RW_MUTEX m_BudgetMutex;</div>
+<div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;    uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;    uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;    uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></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;    VmaCurrentBudgetData()</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="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; VK_MAX_MEMORY_HEAPS; ++heapIndex)</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;            m_BlockBytes[heapIndex] = 0;</div>
+<div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;            m_AllocationBytes[heapIndex] = 0;</div>
+<div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;            m_VulkanUsage[heapIndex] = 0;</div>
+<div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;            m_VulkanBudget[heapIndex] = 0;</div>
+<div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;            m_BlockBytesAtBudgetFetch[heapIndex] = 0;</div>
+<div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;<span class="preprocessor">#endif</span></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; </div>
+<div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;        m_OperationsSinceBudgetFetch = 0;</div>
+<div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;<span class="preprocessor">#endif</span></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;};</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">// Main allocator object.</span></div>
+<div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</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;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div>
+<div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
+<div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div>
+<div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBindMemory2;</div>
+<div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;    <span class="keywordtype">bool</span> m_UseExtMemoryBudget;</div>
+<div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;    VkDevice m_hDevice;</div>
+<div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;    VkInstance m_hInstance;</div>
+<div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div>
+<div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div>
+<div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div>
+<div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;    VmaAllocationObjectAllocator m_AllocationObjectAllocator;</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;    <span class="comment">// Each bit (1 &lt;&lt; i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.</span></div>
+<div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;    uint32_t m_HeapSizeLimitMask;</div>
+<div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160; </div>
+<div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div>
+<div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</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="comment">// Default pools.</span></div>
+<div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</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="comment">// Each vector is sorted by memory (handle value).</span></div>
+<div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div>
+<div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;    VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160; </div>
+<div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;    VmaCurrentBudgetData m_Budget;</div>
+<div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160; </div>
+<div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;    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="l06951"></a><span class="lineno"> 6951</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="l06952"></a><span class="lineno"> 6952</span>&#160;    ~VmaAllocator_T();</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="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</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="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="l06959"></a><span class="lineno"> 6959</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</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;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div>
+<div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div>
+<div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div>
+<div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;    }</div>
+<div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160; </div>
+<div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div>
+<div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div>
+<div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160; </div>
+<div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div>
+<div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</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="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div>
+<div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06981"></a><span class="lineno"> 6981</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="l06982"></a><span class="lineno"> 6982</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</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;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div>
+<div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div>
+<div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div>
+<div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</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; </div>
+<div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</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_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div>
+<div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160; </div>
+<div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div>
+<div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div>
+<div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160; </div>
+<div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;    <span class="comment">// Main allocation function.</span></div>
+<div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;    VkResult AllocateMemory(</div>
+<div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l07019"></a><span class="lineno"> 7019</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="l07020"></a><span class="lineno"> 7020</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</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="comment">// Main deallocation function.</span></div>
+<div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;    <span class="keywordtype">void</span> FreeMemory(</div>
+<div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160; </div>
+<div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    VkResult ResizeAllocation(</div>
+<div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
+<div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;        VkDeviceSize newSize);</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="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
+<div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160; </div>
+<div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;    <span class="keywordtype">void</span> GetBudget(</div>
+<div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount);</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
+<div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160; </div>
+<div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;    VkResult DefragmentationBegin(</div>
+<div class="line"><a name="l07043"></a><span class="lineno"> 7043</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="l07044"></a><span class="lineno"> 7044</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div>
+<div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;    VkResult DefragmentationEnd(</div>
+<div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
+<div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160; </div>
+<div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;    <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="l07050"></a><span class="lineno"> 7050</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="l07051"></a><span class="lineno"> 7051</span>&#160; </div>
+<div class="line"><a name="l07052"></a><span class="lineno"> 7052</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="l07053"></a><span class="lineno"> 7053</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="l07054"></a><span class="lineno"> 7054</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="l07055"></a><span class="lineno"> 7055</span>&#160; </div>
+<div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div>
+<div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div>
+<div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160; </div>
+<div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
+<div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
+<div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
+<div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div>
+<div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</div>
+<div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160; </div>
+<div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160; </div>
+<div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;    <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div>
+<div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div>
+<div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;    <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div>
+<div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div>
+<div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;    <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div>
+<div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;    VkResult BindVulkanBuffer(</div>
+<div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;        VkDeviceMemory memory,</div>
+<div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;        VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;        VkBuffer buffer,</div>
+<div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;    <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div>
+<div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;    VkResult BindVulkanImage(</div>
+<div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;        VkDeviceMemory memory,</div>
+<div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;        VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;        VkImage image,</div>
+<div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</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;    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="l07085"></a><span class="lineno"> 7085</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="l07086"></a><span class="lineno"> 7086</span>&#160; </div>
+<div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;    VkResult BindBufferMemory(</div>
+<div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;    VkResult BindImageMemory(</div>
+<div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</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;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div>
+<div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;        VMA_CACHE_OPERATION op);</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">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="l07104"></a><span class="lineno"> 7104</span>&#160; </div>
+<div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;<span class="comment">    Returns bit mask of memory types that can support defragmentation on GPU as</span></div>
+<div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;<span class="comment">    they support creation of required buffer for copy operations.</span></div>
+<div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;    uint32_t GetGpuDefragmentationMemoryTypeBits();</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="keyword">private</span>:</div>
+<div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</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;    VkPhysicalDevice m_PhysicalDevice;</div>
+<div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div>
+<div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;    VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></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;    VMA_RW_MUTEX m_PoolsMutex;</div>
+<div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div>
+<div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div>
+<div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;    uint32_t m_NextPoolId;</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;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div>
+<div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160; </div>
+<div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;    VmaRecorder* m_pRecorder;</div>
+<div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160; </div>
+<div class="line"><a name="l07129"></a><span class="lineno"> 7129</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="l07130"></a><span class="lineno"> 7130</span>&#160; </div>
+<div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div>
+<div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160; </div>
+<div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;    VkResult AllocateMemoryOfType(</div>
+<div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div>
+<div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l07139"></a><span class="lineno"> 7139</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="l07140"></a><span class="lineno"> 7140</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</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;    <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div>
+<div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;    VkResult AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;        <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
+<div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;        <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160; </div>
+<div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div>
+<div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;    VkResult AllocateDedicatedMemory(</div>
+<div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;        <span class="keywordtype">bool</span> withinBudget,</div>
+<div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;        <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160; </div>
+<div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160; </div>
+<div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;<span class="comment">    Calculates and returns bit mask of memory types that can support defragmentation</span></div>
+<div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;<span class="comment">    on GPU as they support creation of required buffer for copy operations.</span></div>
+<div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;    uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160; </div>
+<div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;    <span class="keywordtype">void</span> UpdateVulkanBudget();</div>
+<div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;};</div>
+<div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160; </div>
+<div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div>
+<div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160; </div>
+<div class="line"><a name="l07186"></a><span class="lineno"> 7186</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="l07187"></a><span class="lineno"> 7187</span>&#160;{</div>
+<div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div>
+<div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;}</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;<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="l07192"></a><span class="lineno"> 7192</span>&#160;{</div>
+<div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</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; </div>
+<div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l07197"></a><span class="lineno"> 7197</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="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">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div>
+<div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;}</div>
+<div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160; </div>
+<div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l07203"></a><span class="lineno"> 7203</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="l07204"></a><span class="lineno"> 7204</span>&#160;{</div>
+<div class="line"><a name="l07205"></a><span class="lineno"> 7205</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="l07206"></a><span class="lineno"> 7206</span>&#160;}</div>
+<div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160; </div>
+<div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l07209"></a><span class="lineno"> 7209</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="l07210"></a><span class="lineno"> 7210</span>&#160;{</div>
+<div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;    {</div>
+<div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;        ptr-&gt;~T();</div>
+<div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;        VmaFree(hAllocator, ptr);</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;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l07219"></a><span class="lineno"> 7219</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="l07220"></a><span class="lineno"> 7220</span>&#160;{</div>
+<div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
+<div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;            ptr[i].~T();</div>
+<div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;        VmaFree(hAllocator, ptr);</div>
+<div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;    }</div>
+<div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;}</div>
+<div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160; </div>
+<div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;<span class="comment">// VmaStringBuilder</span></div>
+<div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160; </div>
+<div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="keyword">class </span>VmaStringBuilder</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="keyword">public</span>:</div>
+<div class="line"><a name="l07237"></a><span class="lineno"> 7237</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="l07238"></a><span class="lineno"> 7238</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="l07239"></a><span class="lineno"> 7239</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="l07240"></a><span class="lineno"> 7240</span>&#160; </div>
+<div class="line"><a name="l07241"></a><span class="lineno"> 7241</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="l07242"></a><span class="lineno"> 7242</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="l07243"></a><span class="lineno"> 7243</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div>
+<div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div>
+<div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div>
+<div class="line"><a name="l07246"></a><span class="lineno"> 7246</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="l07247"></a><span class="lineno"> 7247</span>&#160; </div>
+<div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div>
+<div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;};</div>
+<div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160; </div>
+<div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;{</div>
+<div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
+<div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div>
+<div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;    {</div>
+<div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div>
+<div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;        m_Data.resize(oldCount + strLen);</div>
+<div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div>
+<div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;    }</div>
+<div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;}</div>
+<div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160; </div>
+<div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div>
+<div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;{</div>
+<div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;    <span class="keywordtype">char</span> buf[11];</div>
+<div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;    buf[10] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[10];</div>
+<div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;    <span class="keywordflow">do</span></div>
+<div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;    {</div>
+<div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
+<div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;        num /= 10;</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;    <span class="keywordflow">while</span>(num);</div>
+<div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;    Add(p);</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; </div>
+<div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div>
+<div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;{</div>
+<div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;    <span class="keywordtype">char</span> buf[21];</div>
+<div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;    buf[20] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[20];</div>
+<div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;    <span class="keywordflow">do</span></div>
+<div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;    {</div>
+<div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
+<div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;        num /= 10;</div>
+<div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;    }</div>
+<div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;    <span class="keywordflow">while</span>(num);</div>
+<div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;    Add(p);</div>
+<div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;}</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;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</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="keywordtype">char</span> buf[21];</div>
+<div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div>
+<div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;    Add(buf);</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; </div>
+<div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160; </div>
+<div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;<span class="comment">// VmaJsonWriter</span></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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160; </div>
+<div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div>
+<div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;{</div>
+<div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div>
+<div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div>
+<div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;    ~VmaJsonWriter();</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="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
+<div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;    <span class="keywordtype">void</span> EndObject();</div>
+<div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;    </div>
+<div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
+<div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;    <span class="keywordtype">void</span> EndArray();</div>
+<div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;    </div>
+<div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
+<div class="line"><a name="l07319"></a><span class="lineno"> 7319</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="l07320"></a><span class="lineno"> 7320</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="l07321"></a><span class="lineno"> 7321</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div>
+<div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div>
+<div class="line"><a name="l07323"></a><span class="lineno"> 7323</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="l07324"></a><span class="lineno"> 7324</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="l07325"></a><span class="lineno"> 7325</span>&#160;    </div>
+<div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div>
+<div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div>
+<div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div>
+<div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div>
+<div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160; </div>
+<div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07332"></a><span class="lineno"> 7332</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="l07333"></a><span class="lineno"> 7333</span>&#160; </div>
+<div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div>
+<div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    {</div>
+<div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;        COLLECTION_TYPE_OBJECT,</div>
+<div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;        COLLECTION_TYPE_ARRAY,</div>
+<div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;    };</div>
+<div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;    <span class="keyword">struct </span>StackItem</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;        COLLECTION_TYPE type;</div>
+<div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;        uint32_t valueCount;</div>
+<div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</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; </div>
+<div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;    VmaStringBuilder&amp; m_SB;</div>
+<div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div>
+<div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div>
+<div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160; </div>
+<div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div>
+<div class="line"><a name="l07351"></a><span class="lineno"> 7351</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="l07352"></a><span class="lineno"> 7352</span>&#160;};</div>
+<div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160; </div>
+<div class="line"><a name="l07354"></a><span class="lineno"> 7354</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="l07355"></a><span class="lineno"> 7355</span>&#160; </div>
+<div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div>
+<div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;    m_SB(sb),</div>
+<div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div>
+<div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;    m_InsideString(false)</div>
+<div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;{</div>
+<div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;}</div>
+<div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160; </div>
+<div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div>
+<div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;{</div>
+<div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;    VMA_ASSERT(m_Stack.empty());</div>
+<div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;}</div>
+<div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160; </div>
+<div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</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;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div>
+<div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160; </div>
+<div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;    StackItem item;</div>
+<div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div>
+<div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;    item.valueCount = 0;</div>
+<div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;    item.singleLineMode = singleLine;</div>
+<div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;    m_Stack.push_back(item);</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; </div>
+<div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div>
+<div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;{</div>
+<div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;    VMA_ASSERT(!m_InsideString);</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;    WriteIndent(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</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;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div>
+<div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;    m_Stack.pop_back();</div>
+<div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;}</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="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</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;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div>
+<div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160; </div>
+<div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;    StackItem item;</div>
+<div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div>
+<div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;    item.valueCount = 0;</div>
+<div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;    item.singleLineMode = singleLine;</div>
+<div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;    m_Stack.push_back(item);</div>
+<div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;}</div>
+<div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160; </div>
+<div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</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_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160; </div>
+<div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</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;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div>
+<div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;    m_Stack.pop_back();</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; </div>
+<div class="line"><a name="l07419"></a><span class="lineno"> 7419</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="l07420"></a><span class="lineno"> 7420</span>&#160;{</div>
+<div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;    BeginString(pStr);</div>
+<div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;    EndString();</div>
+<div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;}</div>
+<div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160; </div>
+<div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160; </div>
+<div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    BeginValue(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
+<div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l07432"></a><span class="lineno"> 7432</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="l07433"></a><span class="lineno"> 7433</span>&#160;    {</div>
+<div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;        ContinueString(pStr);</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; </div>
+<div class="line"><a name="l07438"></a><span class="lineno"> 7438</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="l07439"></a><span class="lineno"> 7439</span>&#160;{</div>
+<div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160; </div>
+<div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
+<div class="line"><a name="l07443"></a><span class="lineno"> 7443</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="l07444"></a><span class="lineno"> 7444</span>&#160;    {</div>
+<div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div>
+<div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div>
+<div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;        {</div>
+<div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</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="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</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;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</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">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</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;            m_SB.Add(ch);</div>
+<div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;        }</div>
+<div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</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;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div>
+<div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div>
+<div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div>
+<div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div>
+<div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div>
+<div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div>
+<div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div>
+<div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div>
+<div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div>
+<div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div>
+<div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div>
+<div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;            <span class="keywordflow">break</span>;</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;    }</div>
+<div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;}</div>
+<div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160; </div>
+<div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div>
+<div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;{</div>
+<div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;    m_SB.AddNumber(n);</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;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div>
+<div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;{</div>
+<div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;    m_SB.AddNumber(n);</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; </div>
+<div class="line"><a name="l07494"></a><span class="lineno"> 7494</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="l07495"></a><span class="lineno"> 7495</span>&#160;{</div>
+<div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;    m_SB.AddPointer(ptr);</div>
+<div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;}</div>
+<div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160; </div>
+<div class="line"><a name="l07500"></a><span class="lineno"> 7500</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="l07501"></a><span class="lineno"> 7501</span>&#160;{</div>
+<div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l07503"></a><span class="lineno"> 7503</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="l07504"></a><span class="lineno"> 7504</span>&#160;    {</div>
+<div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;        ContinueString(pStr);</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;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
+<div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;}</div>
+<div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160; </div>
+<div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</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;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;    m_SB.AddNumber(n);</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="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</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;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;    m_SB.AddNumber(n);</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; </div>
+<div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</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;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07529"></a><span class="lineno"> 7529</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="l07530"></a><span class="lineno"> 7530</span>&#160;}</div>
+<div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160; </div>
+<div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</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;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</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; </div>
+<div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div>
+<div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;{</div>
+<div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</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;        StackItem&amp; currItem = m_Stack.back();</div>
+<div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
+<div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;            currItem.valueCount % 2 == 0)</div>
+<div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;        {</div>
+<div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;            VMA_ASSERT(isString);</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; </div>
+<div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
+<div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;            currItem.valueCount % 2 != 0)</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;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</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">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</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;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div>
+<div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;            WriteIndent();</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;        <span class="keywordflow">else</span></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;            WriteIndent();</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;        ++currItem.valueCount;</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;}</div>
+<div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160; </div>
+<div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</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">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div>
+<div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;    {</div>
+<div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;        m_SB.AddNewLine();</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="keywordtype">size_t</span> count = m_Stack.size();</div>
+<div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div>
+<div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;        {</div>
+<div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;            --count;</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;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div>
+<div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;        {</div>
+<div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;            m_SB.Add(INDENT);</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;    }</div>
+<div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;}</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="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160; </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="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="l07591"></a><span class="lineno"> 7591</span>&#160;{</div>
+<div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div>
+<div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;    {</div>
+<div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</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;        FreeUserDataString(hAllocator);</div>
+<div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160; </div>
+<div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</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> <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrSrc = (<span class="keywordtype">char</span>*)pUserData;</div>
+<div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div>
+<div class="line"><a name="l07602"></a><span class="lineno"> 7602</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="l07603"></a><span class="lineno"> 7603</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div>
+<div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;            m_pUserData = newStrDst;</div>
+<div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;        }</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">else</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;        m_pUserData = pUserData;</div>
+<div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;    }</div>
+<div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;}</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="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div>
+<div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;    VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;    VkDeviceSize offset)</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;    VMA_ASSERT(block != VMA_NULL);</div>
+<div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</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;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div>
+<div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</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;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div>
+<div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div>
+<div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;            ++mapRefCount;</div>
+<div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div>
+<div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</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; </div>
+<div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;    m_BlockAllocation.m_Block = block;</div>
+<div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;    m_BlockAllocation.m_Offset = offset;</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; </div>
+<div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</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;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;    m_BlockAllocation.m_Offset = newOffset;</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; </div>
+<div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div>
+<div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    {</div>
+<div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div>
+<div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;        <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</div>
+<div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160; </div>
+<div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div>
+<div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div>
+<div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</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;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div>
+<div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div>
+<div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div>
+<div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;    }</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; </div>
+<div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div>
+<div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;    {</div>
+<div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div>
+<div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;        {</div>
+<div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div>
+<div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div>
+<div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</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="keywordflow">else</span></div>
+<div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;        {</div>
+<div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</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">break</span>;</div>
+<div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div>
+<div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div>
+<div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</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; </div>
+<div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div>
+<div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;    {</div>
+<div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div>
+<div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;    }</div>
+<div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;}</div>
+<div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160; </div>
+<div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;{</div>
+<div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;    VMA_ASSERT(CanBecomeLost());</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;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div>
+<div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div>
+<div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div>
+<div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;    <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;    {</div>
+<div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</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;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;        }</div>
+<div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div>
+<div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;        {</div>
+<div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;        }</div>
+<div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></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="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div>
+<div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;            {</div>
+<div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div>
+<div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</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;        }</div>
+<div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;    }</div>
+<div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;}</div>
+<div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160; </div>
+<div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160; </div>
+<div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div>
+<div class="line"><a name="l07757"></a><span class="lineno"> 7757</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="l07758"></a><span class="lineno"> 7758</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div>
+<div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div>
+<div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div>
+<div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div>
+<div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div>
+<div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</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;<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="l07767"></a><span class="lineno"> 7767</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
+<div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div>
+<div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160; </div>
+<div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;    json.WriteNumber(m_Size);</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">if</span>(m_pUserData != VMA_NULL)</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;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div>
+<div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</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;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div>
+<div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;        }</div>
+<div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;        <span class="keywordflow">else</span></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;            json.BeginString();</div>
+<div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div>
+<div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;            json.EndString();</div>
+<div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;        }</div>
+<div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;    }</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;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div>
+<div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</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;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div>
+<div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</div>
+<div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160; </div>
+<div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div>
+<div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;    {</div>
+<div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div>
+<div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div>
+<div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;    }</div>
+<div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;}</div>
+<div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160; </div>
+<div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;<span class="preprocessor">#endif</span></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="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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;    VMA_ASSERT(IsUserDataString());</div>
+<div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</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="keywordtype">char</span>* <span class="keyword">const</span> oldStr = (<span class="keywordtype">char</span>*)m_pUserData;</div>
+<div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div>
+<div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div>
+<div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;        m_pUserData = VMA_NULL;</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;}</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;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div>
+<div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;{</div>
+<div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div>
+<div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;    {</div>
+<div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;        ++m_MapCount;</div>
+<div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;    }</div>
+<div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</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; </div>
+<div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</div>
+<div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;    }</div>
+<div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    {</div>
+<div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</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; </div>
+<div class="line"><a name="l07844"></a><span class="lineno"> 7844</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="l07845"></a><span class="lineno"> 7845</span>&#160;{</div>
+<div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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;    <span class="keywordflow">if</span>(m_MapCount != 0)</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>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</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_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div>
+<div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div>
+<div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;            ++m_MapCount;</div>
+<div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;        }</div>
+<div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;        {</div>
+<div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div>
+<div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</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;    }</div>
+<div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;    <span class="keywordflow">else</span></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;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
+<div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;            hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;            m_DedicatedAllocation.m_hMemory,</div>
+<div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;            0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;            0, <span class="comment">// flags</span></div>
+<div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;            ppData);</div>
+<div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</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;            m_DedicatedAllocation.m_pMappedData = *ppData;</div>
+<div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;            m_MapCount = 1;</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">return</span> result;</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;}</div>
+<div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160; </div>
+<div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</div>
+<div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</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;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div>
+<div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;                hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;                m_DedicatedAllocation.m_hMemory);</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;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</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;}</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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">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="l07905"></a><span class="lineno"> 7905</span>&#160;{</div>
+<div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
+<div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
+<div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div>
+<div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160; </div>
+<div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
+<div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div>
+<div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
+<div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div>
+<div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160; </div>
+<div class="line"><a name="l07923"></a><span class="lineno"> 7923</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="l07924"></a><span class="lineno"> 7924</span>&#160;    {</div>
+<div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div>
+<div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div>
+<div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
+<div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div>
+<div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div>
+<div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;        json.EndObject();</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; </div>
+<div class="line"><a name="l07936"></a><span class="lineno"> 7936</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="l07937"></a><span class="lineno"> 7937</span>&#160;    {</div>
+<div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div>
+<div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div>
+<div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
+<div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div>
+<div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div>
+<div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;    }</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;    json.EndObject();</div>
+<div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;}</div>
+<div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160; </div>
+<div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160; </div>
+<div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div>
+<div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;{</div>
+<div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;    <span class="keywordtype">bool</span> operator()(</div>
+<div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
+<div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;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="keywordtype">bool</span> operator()(</div>
+<div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
+<div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</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; </div>
+<div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div>
+<div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160; </div>
+<div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;    m_Size(0),</div>
+<div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</div>
+<div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;{</div>
+<div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;}</div>
+<div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160; </div>
+<div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160; </div>
+<div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;    VkDeviceSize unusedBytes,</div>
+<div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div>
+<div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;    json.WriteNumber(GetSize());</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;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
+<div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;    json.WriteNumber(unusedBytes);</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;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
+<div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</div>
+<div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160; </div>
+<div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
+<div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</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;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div>
+<div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;    json.BeginArray();</div>
+<div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;        </div>
+<div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
+<div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;    json.WriteNumber(offset);</div>
+<div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160; </div>
+<div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;    hAllocation-&gt;PrintParameters(json);</div>
+<div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160; </div>
+<div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;    json.EndObject();</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; </div>
+<div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;        </div>
+<div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
+<div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;    json.WriteNumber(offset);</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;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
+<div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</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;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;    json.WriteNumber(size);</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;    json.EndObject();</div>
+<div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;}</div>
+<div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160; </div>
+<div class="line"><a name="l08037"></a><span class="lineno"> 8037</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="l08038"></a><span class="lineno"> 8038</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;    json.EndArray();</div>
+<div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;}</div>
+<div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160; </div>
+<div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160; </div>
+<div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</span></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;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;    m_FreeCount(0),</div>
+<div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;    m_SumFreeSize(0),</div>
+<div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;{</div>
+<div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;}</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;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</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;}</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="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;{</div>
+<div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;    VmaBlockMetadata::Init(size);</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;    m_FreeCount = 1;</div>
+<div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;    m_SumFreeSize = size;</div>
+<div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160; </div>
+<div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;    VmaSuballocation suballoc = {};</div>
+<div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;    suballoc.offset = 0;</div>
+<div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;    suballoc.size = size;</div>
+<div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</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;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
+<div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;    m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div>
+<div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;    --suballocItem;</div>
+<div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</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; </div>
+<div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</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">// Expected offset of new suballocation as calculated from previous ones.</span></div>
+<div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;    VkDeviceSize calculatedOffset = 0;</div>
+<div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div>
+<div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;    uint32_t calculatedFreeCount = 0;</div>
+<div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div>
+<div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div>
+<div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div>
+<div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div>
+<div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div>
+<div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div>
+<div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</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;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;        ++suballocItem)</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="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</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="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div>
+<div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div>
+<div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160; </div>
+<div class="line"><a name="l08106"></a><span class="lineno"> 8106</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="l08107"></a><span class="lineno"> 8107</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div>
+<div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</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;        VMA_VALIDATE(currFree == (subAlloc.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;        <span class="keywordflow">if</span>(currFree)</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;            calculatedSumFreeSize += subAlloc.size;</div>
+<div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;            ++calculatedFreeCount;</div>
+<div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                ++freeSuballocationsToRegister;</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; </div>
+<div class="line"><a name="l08121"></a><span class="lineno"> 8121</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="l08122"></a><span class="lineno"> 8122</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;        }</div>
+<div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;        <span class="keywordflow">else</span></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;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div>
+<div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</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">// Margin required between allocations - previous allocation must be free.</span></div>
+<div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</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; </div>
+<div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;        calculatedOffset += subAlloc.size;</div>
+<div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;        prevFree = currFree;</div>
+<div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;    }</div>
+<div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160; </div>
+<div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div>
+<div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;    <span class="comment">// match expected one.</span></div>
+<div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</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;    VkDeviceSize lastSize = 0;</div>
+<div class="line"><a name="l08142"></a><span class="lineno"> 8142</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="l08143"></a><span class="lineno"> 8143</span>&#160;    {</div>
+<div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div>
+<div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;        </div>
+<div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div>
+<div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div>
+<div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</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;        lastSize = suballocItem-&gt;size;</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">// Check if totals match calculacted values.</span></div>
+<div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div>
+<div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div>
+<div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div>
+<div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<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="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</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;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div>
+<div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;    }</div>
+<div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    <span class="keywordflow">else</span></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;        <span class="keywordflow">return</span> 0;</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;}</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">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div>
+<div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;}</div>
+<div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160; </div>
+<div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;<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="l08181"></a><span class="lineno"> 8181</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
+<div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div>
+<div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div>
+<div class="line"><a name="l08189"></a><span class="lineno"> 8189</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="l08190"></a><span class="lineno"> 8190</span>&#160; </div>
+<div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
+<div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</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="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;        ++suballocItem)</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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</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;            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="l08204"></a><span class="lineno"> 8204</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="l08205"></a><span class="lineno"> 8205</span>&#160;        }</div>
+<div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;        {</div>
+<div class="line"><a name="l08208"></a><span class="lineno"> 8208</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="l08209"></a><span class="lineno"> 8209</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="l08210"></a><span class="lineno"> 8210</span>&#160;        }</div>
+<div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;    }</div>
+<div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;}</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="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="l08215"></a><span class="lineno"> 8215</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
+<div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160; </div>
+<div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
+<div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div>
+<div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div>
+<div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
+<div class="line"><a name="l08222"></a><span class="lineno"> 8222</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="l08223"></a><span class="lineno"> 8223</span>&#160;}</div>
+<div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160; </div>
+<div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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;<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="l08228"></a><span class="lineno"> 8228</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;    PrintDetailedMap_Begin(json,</div>
+<div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div>
+<div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;        m_Suballocations.size() - (size_t)m_FreeCount, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></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="keywordtype">size_t</span> i = 0;</div>
+<div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;        ++suballocItem, ++i)</div>
+<div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;    {</div>
+<div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;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;        <span class="keywordflow">else</span></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;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</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;    }</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;    PrintDetailedMap_End(json);</div>
+<div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;}</div>
+<div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160; </div>
+<div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160; </div>
+<div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div>
+<div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;    VMA_ASSERT(!upperAddress);</div>
+<div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
+<div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;    VMA_HEAVY_ASSERT(Validate());</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;    pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160; </div>
+<div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div>
+<div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div>
+<div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div>
+<div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;    {</div>
+<div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div>
+<div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div>
+<div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div>
+<div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;    {</div>
+<div class="line"><a name="l08285"></a><span class="lineno"> 8285</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="l08286"></a><span class="lineno"> 8286</span>&#160;        {</div>
+<div class="line"><a name="l08287"></a><span class="lineno"> 8287</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="l08288"></a><span class="lineno"> 8288</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;                m_FreeSuballocationsBySize.data(),</div>
+<div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div>
+<div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div>
+<div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;                VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
+<div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</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="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;                    allocType,</div>
+<div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
+<div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
+<div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;                }</div>
+<div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;            }</div>
+<div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;        }</div>
+<div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET)</div>
+<div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;        {</div>
+<div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;                it != m_Suballocations.end();</div>
+<div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;                ++it)</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="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp; CheckAllocation(</div>
+<div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;                    allocType,</div>
+<div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;                    it,</div>
+<div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = it;</div>
+<div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;                }</div>
+<div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;            }</div>
+<div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;        }</div>
+<div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;        {</div>
+<div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div>
+<div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</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;                <span class="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;                    allocType,</div>
+<div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
+<div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
+<div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;                {</div>
+<div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
+<div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;        }</div>
+<div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;    }</div>
+<div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160; </div>
+<div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</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">// Brute-force algorithm. TODO: Come up with something better.</span></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="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div>
+<div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;        tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div>
+<div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;            suballocIt != m_Suballocations.end();</div>
+<div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;            ++suballocIt)</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="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div>
+<div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;            {</div>
+<div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;                    allocType,</div>
+<div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;                    suballocIt,</div>
+<div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;                    canMakeOtherLost,</div>
+<div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;                    &amp;tmpAllocRequest.offset,</div>
+<div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div>
+<div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div>
+<div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</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;                    <span class="keywordflow">if</span>(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="l08395"></a><span class="lineno"> 8395</span>&#160;                    {</div>
+<div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div>
+<div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
+<div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;                        <span class="keywordflow">break</span>;</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;                    <span class="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</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;                        *pAllocationRequest = tmpAllocRequest;</div>
+<div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
+<div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;                        found = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;                    }</div>
+<div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;                }</div>
+<div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;            }</div>
+<div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;        }</div>
+<div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160; </div>
+<div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;        <span class="keywordflow">return</span> found;</div>
+<div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;    }</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;}</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">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(pAllocationRequest &amp;&amp; pAllocationRequest-&gt;type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160; </div>
+<div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</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;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;        {</div>
+<div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;            ++pAllocationRequest-&gt;item;</div>
+<div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;        }</div>
+<div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
+<div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div>
+<div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div>
+<div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;        }</div>
+<div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;        {</div>
+<div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;        }</div>
+<div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;    }</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;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
+<div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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="keywordflow">return</span> <span class="keyword">true</span>;</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; </div>
+<div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    uint32_t lostAllocationCount = 0;</div>
+<div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;        it != m_Suballocations.end();</div>
+<div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;        ++it)</div>
+<div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;    {</div>
+<div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            it = FreeSuballocation(it);</div>
+<div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;            ++lostAllocationCount;</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="keywordflow">return</span> lostAllocationCount;</div>
+<div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;}</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;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</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;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;        it != m_Suballocations.end();</div>
+<div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;        ++it)</div>
+<div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;    {</div>
+<div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;        {</div>
+<div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;            }</div>
+<div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;        }</div>
+<div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;    }</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="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div>
+<div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;{</div>
+<div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div>
+<div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div>
+<div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div>
+<div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div>
+<div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div>
+<div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div>
+<div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div>
+<div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</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">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div>
+<div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;    <span class="comment">// it to become used.</span></div>
+<div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;    UnregisterFreeSuballocation(request.item);</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;    suballoc.offset = request.offset;</div>
+<div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;    suballoc.size = allocSize;</div>
+<div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;    suballoc.type = type;</div>
+<div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;    suballoc.hAllocation = hAllocation;</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;    <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="l08519"></a><span class="lineno"> 8519</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</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;        VmaSuballocation paddingSuballoc = {};</div>
+<div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div>
+<div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;        paddingSuballoc.size = paddingEnd;</div>
+<div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;        VmaSuballocationList::iterator next = request.item;</div>
+<div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;        ++next;</div>
+<div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div>
+<div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div>
+<div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</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; </div>
+<div class="line"><a name="l08532"></a><span class="lineno"> 8532</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="l08533"></a><span class="lineno"> 8533</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div>
+<div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;    {</div>
+<div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;        VmaSuballocation paddingSuballoc = {};</div>
+<div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div>
+<div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;        paddingSuballoc.size = paddingBegin;</div>
+<div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div>
+<div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div>
+<div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</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; </div>
+<div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;    <span class="comment">// Update totals.</span></div>
+<div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;    m_FreeCount = m_FreeCount - 1;</div>
+<div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</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;        ++m_FreeCount;</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;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</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;        ++m_FreeCount;</div>
+<div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;    }</div>
+<div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;    m_SumFreeSize -= allocSize;</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; </div>
+<div class="line"><a name="l08557"></a><span class="lineno"> 8557</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="l08558"></a><span class="lineno"> 8558</span>&#160;{</div>
+<div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
+<div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        suballocItem != m_Suballocations.end();</div>
+<div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</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;            FreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div>
+<div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div>
+<div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;}</div>
+<div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160; </div>
+<div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</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="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
+<div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;        suballocItem != m_Suballocations.end();</div>
+<div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</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;            FreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div>
+<div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</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; </div>
+<div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;    VkDeviceSize lastSize = 0;</div>
+<div class="line"><a name="l08593"></a><span class="lineno"> 8593</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="l08594"></a><span class="lineno"> 8594</span>&#160;    {</div>
+<div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</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;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
+<div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div>
+<div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;        lastSize = it-&gt;size;</div>
+<div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;    }</div>
+<div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;}</div>
+<div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160; </div>
+<div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div>
+<div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div>
+<div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;    VkDeviceSize* pOffset,</div>
+<div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
+<div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;    VkDeviceSize* pSumFreeSize,</div>
+<div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div>
+<div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</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;    *itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;    *pSumFreeSize = 0;</div>
+<div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;    *pSumItemSize = 0;</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="keywordflow">if</span>(canMakeOtherLost)</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;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            *pSumFreeSize = suballocItem-&gt;size;</div>
+<div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;        }</div>
+<div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;        <span class="keywordflow">else</span></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="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;            {</div>
+<div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;                ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</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="keywordflow">else</span></div>
+<div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;            {</div>
+<div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div>
+<div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</div>
+<div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;        {</div>
+<div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;        }</div>
+<div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160; </div>
+<div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
+<div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;        *pOffset = suballocItem-&gt;offset;</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="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;        {</div>
+<div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;        }</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;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div>
+<div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160; </div>
+<div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
+<div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;        {</div>
+<div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
+<div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</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;                --prevSuballocItem;</div>
+<div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
+<div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</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;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;                    }</div>
+<div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;                }</div>
+<div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;            }</div>
+<div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;            {</div>
+<div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;            }</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">// Now that we have final *pOffset, check if we are past suballocItem.</span></div>
+<div class="line"><a name="l08695"></a><span class="lineno"> 8695</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="l08696"></a><span class="lineno"> 8696</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div>
+<div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;        {</div>
+<div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    </div>
+<div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div>
+<div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div>
+<div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160; </div>
+<div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
+<div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</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="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div>
+<div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;        <span class="comment">// Another early return check.</span></div>
+<div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</div>
+<div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;        {</div>
+<div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;        }</div>
+<div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160; </div>
+<div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div>
+<div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div>
+<div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div>
+<div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div>
+<div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;        {</div>
+<div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div>
+<div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</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;                ++lastSuballocItem;</div>
+<div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</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;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;                }</div>
+<div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div>
+<div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;                }</div>
+<div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;                <span class="keywordflow">else</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;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                        ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div>
+<div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;                    }</div>
+<div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;                    {</div>
+<div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;                    }</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;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div>
+<div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div>
+<div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            }</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; </div>
+<div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
+<div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div>
+<div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;            ++nextSuballocItem;</div>
+<div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
+<div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;            {</div>
+<div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
+<div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                            ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;                        }</div>
+<div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;                        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;                        {</div>
+<div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                    }</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">else</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;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;                    <span class="keywordflow">break</span>;</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;                ++nextSuballocItem;</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;        }</div>
+<div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;    }</div>
+<div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;    {</div>
+<div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</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;        *pSumFreeSize = suballoc.size;</div>
+<div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160; </div>
+<div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div>
+<div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div>
+<div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;        {</div>
+<div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;        }</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;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
+<div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;        *pOffset = suballoc.offset;</div>
+<div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;    </div>
+<div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            *pOffset += VMA_DEBUG_MARGIN;</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;    </div>
+<div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</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">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
+<div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;        {</div>
+<div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
+<div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</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;                --prevSuballocItem;</div>
+<div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
+<div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</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>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;                        <span class="keywordflow">break</span>;</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="keywordflow">else</span></div>
+<div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;                    <span class="keywordflow">break</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="keywordflow">if</span>(bufferImageGranularityConflict)</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;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</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">// Calculate padding at the beginning based on current offset.</span></div>
+<div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div>
+<div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160; </div>
+<div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
+<div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160; </div>
+<div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;        <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="l08844"></a><span class="lineno"> 8844</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</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">return</span> <span class="keyword">false</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; </div>
+<div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div>
+<div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;            ++nextSuballocItem;</div>
+<div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
+<div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;            {</div>
+<div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
+<div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;                {</div>
+<div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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="keywordflow">return</span> <span class="keyword">false</span>;</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="keywordflow">else</span></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;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;                }</div>
+<div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;                ++nextSuballocItem;</div>
+<div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;            }</div>
+<div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;        }</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; </div>
+<div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div>
+<div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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; </div>
+<div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</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;    VMA_ASSERT(item != m_Suballocations.end());</div>
+<div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    VmaSuballocationList::iterator nextItem = item;</div>
+<div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;    ++nextItem;</div>
+<div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div>
+<div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160; </div>
+<div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;    item-&gt;size += nextItem-&gt;size;</div>
+<div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;    --m_FreeCount;</div>
+<div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;    m_Suballocations.erase(nextItem);</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; </div>
+<div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</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;    <span class="comment">// Change this suballocation to be marked as free.</span></div>
+<div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;    </div>
+<div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;    <span class="comment">// Update totals.</span></div>
+<div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;    ++m_FreeCount;</div>
+<div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;    m_SumFreeSize += suballoc.size;</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;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div>
+<div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</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;    VmaSuballocationList::iterator nextItem = suballocItem;</div>
+<div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;    ++nextItem;</div>
+<div class="line"><a name="l08911"></a><span class="lineno"> 8911</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="l08912"></a><span class="lineno"> 8912</span>&#160;    {</div>
+<div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</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;    VmaSuballocationList::iterator prevItem = suballocItem;</div>
+<div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</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;        --prevItem;</div>
+<div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            mergeWithPrev = <span class="keyword">true</span>;</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; </div>
+<div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div>
+<div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;    {</div>
+<div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;        UnregisterFreeSuballocation(nextItem);</div>
+<div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;        MergeFreeWithNext(suballocItem);</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; </div>
+<div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</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;        UnregisterFreeSuballocation(prevItem);</div>
+<div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;        MergeFreeWithNext(prevItem);</div>
+<div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;        RegisterFreeSuballocation(prevItem);</div>
+<div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;        <span class="keywordflow">return</span> prevItem;</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;    <span class="keywordflow">else</span></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;        RegisterFreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;        <span class="keywordflow">return</span> suballocItem;</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; </div>
+<div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</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;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</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">// You may want to enable this validation at the beginning or at the end of</span></div>
+<div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
+<div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div>
+<div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160; </div>
+<div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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>(m_FreeSuballocationsBySize.empty())</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;            m_FreeSuballocationsBySize.push_back(item);</div>
+<div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;        }</div>
+<div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;        <span class="keywordflow">else</span></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;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div>
+<div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;        }</div>
+<div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;    }</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="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div>
+<div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;}</div>
+<div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160; </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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div>
+<div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;{</div>
+<div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</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="comment">// You may want to enable this validation at the beginning or at the end of</span></div>
+<div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
+<div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;            m_FreeSuballocationsBySize.data(),</div>
+<div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div>
+<div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;            item,</div>
+<div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;            VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
+<div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div>
+<div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;            ++index)</div>
+<div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;        {</div>
+<div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div>
+<div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;            {</div>
+<div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div>
+<div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;            }</div>
+<div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
+<div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;        }</div>
+<div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
+<div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;    }</div>
+<div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160; </div>
+<div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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; </div>
+<div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div>
+<div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;    VmaSuballocationType&amp; inOutPrevSuballocType)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</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">return</span> <span class="keyword">false</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; </div>
+<div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;    VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;    <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;        it != m_Suballocations.cend();</div>
+<div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;        ++it)</div>
+<div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;    {</div>
+<div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = it-&gt;type;</div>
+<div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;        <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</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;            minAlignment = VMA_MIN(minAlignment, it-&gt;hAllocation-&gt;GetAlignment());</div>
+<div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</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;                typeConflictFound = <span class="keyword">true</span>;</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;            inOutPrevSuballocType = suballocType;</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;    }</div>
+<div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160; </div>
+<div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;    <span class="keywordflow">return</span> typeConflictFound || minAlignment &gt;= bufferImageGranularity;</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; </div>
+<div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></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;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;    m_SumFreeSize(0),</div>
+<div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;    m_1stVectorIndex(0),</div>
+<div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div>
+<div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;    m_1stNullItemsBeginCount(0),</div>
+<div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;    m_1stNullItemsMiddleCount(0),</div>
+<div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;    m_2ndNullItemsCount(0)</div>
+<div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;{</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;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</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;}</div>
+<div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160; </div>
+<div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</div>
+<div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;    m_SumFreeSize = size;</div>
+<div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;}</div>
+<div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160; </div>
+<div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160; </div>
+<div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div>
+<div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div>
+<div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;        suballocations2nd.empty() ||</div>
+<div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</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;    <span class="keywordflow">if</span>(!suballocations1st.empty())</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="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div>
+<div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
+<div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</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;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</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;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
+<div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</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; </div>
+<div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div>
+<div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</div>
+<div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160; </div>
+<div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;    VkDeviceSize sumUsedSize = 0;</div>
+<div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
+<div class="line"><a name="l09094"></a><span class="lineno"> 9094</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="l09095"></a><span class="lineno"> 9095</span>&#160;        {</div>
+<div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l09097"></a><span class="lineno"> 9097</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="l09098"></a><span class="lineno"> 9098</span>&#160; </div>
+<div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</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">if</span>(!currFree)</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;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;                sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;            }</div>
+<div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;            <span class="keywordflow">else</span></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;                ++nullItem2ndCount;</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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; </div>
+<div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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; </div>
+<div class="line"><a name="l09119"></a><span class="lineno"> 9119</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="l09120"></a><span class="lineno"> 9120</span>&#160;    {</div>
+<div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;    }</div>
+<div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160; </div>
+<div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;    <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</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">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l09131"></a><span class="lineno"> 9131</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="l09132"></a><span class="lineno"> 9132</span>&#160; </div>
+<div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
+<div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</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">if</span>(!currFree)</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;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;            sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;        }</div>
+<div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;        <span class="keywordflow">else</span></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;            ++nullItem1stCount;</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; </div>
+<div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;    {</div>
+<div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
+<div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l09159"></a><span class="lineno"> 9159</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="l09160"></a><span class="lineno"> 9160</span>&#160; </div>
+<div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
+<div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160; </div>
+<div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div>
+<div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;            {</div>
+<div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;                sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;            }</div>
+<div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;            {</div>
+<div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;                ++nullItem2ndCount;</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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; </div>
+<div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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; </div>
+<div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;    VMA_VALIDATE(offset &lt;= GetSize());</div>
+<div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</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="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;}</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="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div>
+<div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div>
+<div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;}</div>
+<div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160; </div>
+<div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160; </div>
+<div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l09198"></a><span class="lineno"> 9198</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="l09199"></a><span class="lineno"> 9199</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="l09200"></a><span class="lineno"> 9200</span>&#160;<span class="comment">    is available for new allocations.</span></div>
+<div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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;        <span class="keywordflow">return</span> size;</div>
+<div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;    }</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> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160; </div>
+<div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;    <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
+<div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;    {</div>
+<div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
+<div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l09213"></a><span class="lineno"> 9213</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="l09214"></a><span class="lineno"> 9214</span>&#160;<span class="comment">        whould make it a ring buffer).</span></div>
+<div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;<span class="comment">        */</span></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;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div>
+<div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div>
+<div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div>
+<div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;                firstSuballoc.offset,</div>
+<div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.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;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160; </div>
+<div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
+<div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div>
+<div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;        {</div>
+<div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div>
+<div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</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;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160; </div>
+<div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
+<div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div>
+<div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;        {</div>
+<div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div>
+<div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div>
+<div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</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;        <span class="keywordflow">break</span>;</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="keywordflow">default</span>:</div>
+<div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</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="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="l09258"></a><span class="lineno"> 9258</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160; </div>
+<div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div>
+<div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div>
+<div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
+<div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160; </div>
+<div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;    VkDeviceSize lastOffset = 0;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;    {</div>
+<div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;        {</div>
+<div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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; </div>
+<div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;            </div>
+<div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09301"></a><span class="lineno"> 9301</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="l09302"></a><span class="lineno"> 9302</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="l09303"></a><span class="lineno"> 9303</span>&#160;                }</div>
+<div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;            </div>
+<div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l09308"></a><span class="lineno"> 9308</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="l09309"></a><span class="lineno"> 9309</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="l09310"></a><span class="lineno"> 9310</span>&#160;            </div>
+<div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;            {</div>
+<div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09324"></a><span class="lineno"> 9324</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="l09325"></a><span class="lineno"> 9325</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="l09326"></a><span class="lineno"> 9326</span>&#160;               }</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;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;            }</div>
+<div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;        }</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="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;    {</div>
+<div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;        {</div>
+<div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09358"></a><span class="lineno"> 9358</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="l09359"></a><span class="lineno"> 9359</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="l09360"></a><span class="lineno"> 9360</span>&#160;            }</div>
+<div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;            </div>
+<div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l09365"></a><span class="lineno"> 9365</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="l09366"></a><span class="lineno"> 9366</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="l09367"></a><span class="lineno"> 9367</span>&#160;            </div>
+<div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;        }</div>
+<div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;        {</div>
+<div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
+<div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09381"></a><span class="lineno"> 9381</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="l09382"></a><span class="lineno"> 9382</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="l09383"></a><span class="lineno"> 9383</span>&#160;           }</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;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;        }</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="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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; </div>
+<div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
+<div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;            {</div>
+<div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;            </div>
+<div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;                {</div>
+<div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09414"></a><span class="lineno"> 9414</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="l09415"></a><span class="lineno"> 9415</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="l09416"></a><span class="lineno"> 9416</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l09421"></a><span class="lineno"> 9421</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="l09422"></a><span class="lineno"> 9422</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="l09423"></a><span class="lineno"> 9423</span>&#160;            </div>
+<div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;            {</div>
+<div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;                <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;                {</div>
+<div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09437"></a><span class="lineno"> 9437</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="l09438"></a><span class="lineno"> 9438</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="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="comment">// End of loop.</span></div>
+<div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;            }</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;    }</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;    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="l09448"></a><span class="lineno"> 9448</span>&#160;}</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="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="l09451"></a><span class="lineno"> 9451</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div>
+<div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160; </div>
+<div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;    VkDeviceSize lastOffset = 0;</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="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;            {</div>
+<div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;                ++nextAlloc2ndIndex;</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; </div>
+<div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;            {</div>
+<div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;            </div>
+<div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;                {</div>
+<div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09487"></a><span class="lineno"> 9487</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="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;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;                {</div>
+<div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09507"></a><span class="lineno"> 9507</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="l09508"></a><span class="lineno"> 9508</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</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; </div>
+<div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;    {</div>
+<div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;        {</div>
+<div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
+<div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;            </div>
+<div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09540"></a><span class="lineno"> 9540</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="l09541"></a><span class="lineno"> 9541</span>&#160;            }</div>
+<div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;            </div>
+<div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;            ++nextAlloc1stIndex;</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;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;        {</div>
+<div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;            {</div>
+<div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
+<div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</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;                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="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;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</div>
+<div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160; </div>
+<div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;        {</div>
+<div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;            }</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="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09592"></a><span class="lineno"> 9592</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="l09593"></a><span class="lineno"> 9593</span>&#160;                }</div>
+<div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;            </div>
+<div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;            }</div>
+<div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;            <span class="keywordflow">else</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;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l09612"></a><span class="lineno"> 9612</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="l09613"></a><span class="lineno"> 9613</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;            }</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;    }</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09623"></a><span class="lineno"> 9623</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="l09624"></a><span class="lineno"> 9624</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    <span class="comment">// FIRST PASS</span></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;    <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div>
+<div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;    VkDeviceSize usedBytes = 0;</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;    VkDeviceSize lastOffset = 0;</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;    <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div>
+<div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;        {</div>
+<div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;            }</div>
+<div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160; </div>
+<div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;                    ++unusedRangeCount;</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;            </div>
+<div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;                ++alloc2ndCount;</div>
+<div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;                usedBytes += suballoc.size;</div>
+<div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;            </div>
+<div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;            }</div>
+<div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;            {</div>
+<div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;                {</div>
+<div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;            }</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; </div>
+<div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div>
+<div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;    {</div>
+<div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;        {</div>
+<div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;        }</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;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;        {</div>
+<div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;                ++unusedRangeCount;</div>
+<div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;            }</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;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;            ++alloc1stCount;</div>
+<div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;            usedBytes += suballoc.size;</div>
+<div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;            </div>
+<div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;        }</div>
+<div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;        <span class="keywordflow">else</span></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="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;            {</div>
+<div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;                ++unusedRangeCount;</div>
+<div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;            }</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">// End of loop.</span></div>
+<div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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; </div>
+<div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;    {</div>
+<div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;        {</div>
+<div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;                    ++unusedRangeCount;</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;            </div>
+<div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;                ++alloc2ndCount;</div>
+<div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;                usedBytes += suballoc.size;</div>
+<div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;            </div>
+<div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;            }</div>
+<div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;            {</div>
+<div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;                {</div>
+<div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;            }</div>
+<div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;        }</div>
+<div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;    }</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;    <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div>
+<div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</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="comment">// SECOND PASS</span></div>
+<div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;    lastOffset = 0;</div>
+<div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160; </div>
+<div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;        {</div>
+<div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;            {</div>
+<div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;            }</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;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;            {</div>
+<div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;            </div>
+<div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;                {</div>
+<div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;                }</div>
+<div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;            </div>
+<div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;                ++nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;            {</div>
+<div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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; </div>
+<div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;            }</div>
+<div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;        }</div>
+<div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;    }</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;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;    {</div>
+<div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;        {</div>
+<div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;        }</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="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;        {</div>
+<div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
+<div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;            </div>
+<div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;            </div>
+<div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
+<div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;            </div>
+<div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;        }</div>
+<div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;        {</div>
+<div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;            {</div>
+<div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
+<div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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; </div>
+<div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;        }</div>
+<div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;    }</div>
+<div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160; </div>
+<div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;            {</div>
+<div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;                --nextAlloc2ndIndex;</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; </div>
+<div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;            </div>
+<div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;            }</div>
+<div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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; </div>
+<div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;                lastOffset = size;</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;        }</div>
+<div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;    }</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;    PrintDetailedMap_End(json);</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160; </div>
+<div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div>
+<div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160;{</div>
+<div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
+<div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;    <span class="keywordflow">return</span> upperAddress ?</div>
+<div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;        CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
+<div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div>
+<div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;        CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
+<div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</div>
+<div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;}</div>
+<div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160; </div>
+<div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160; </div>
+<div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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(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="l09982"></a><span class="lineno"> 9982</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;    }</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="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div>
+<div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; size)</div>
+<div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;    {</div>
+<div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;    }</div>
+<div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;    VkDeviceSize resultBaseOffset = size - allocSize;</div>
+<div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</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;        <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;        resultBaseOffset = lastSuballoc.offset - allocSize;</div>
+<div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    }</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;    <span class="comment">// Start from offset equal to end of free space.</span></div>
+<div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;    VkDeviceSize resultOffset = resultBaseOffset;</div>
+<div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160; </div>
+<div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;    <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div>
+<div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;        <span class="keywordflow">if</span>(resultOffset &lt; VMA_DEBUG_MARGIN)</div>
+<div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;        {</div>
+<div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        resultOffset -= VMA_DEBUG_MARGIN;</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; </div>
+<div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;    <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;    resultOffset = VmaAlignDown(resultOffset, allocAlignment);</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="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;    <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div>
+<div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;    {</div>
+<div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;        <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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;            <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
+<div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;            <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;            {</div>
+<div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;                <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div>
+<div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;                {</div>
+<div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;                    bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;                }</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;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;                <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;        }</div>
+<div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;        {</div>
+<div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;            resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;        }</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="comment">// There is enough free space.</span></div>
+<div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;    <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div>
+<div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;        suballocations1st.back().offset + suballocations1st.back().size :</div>
+<div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;        0;</div>
+<div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;    <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</div>
+<div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;    {</div>
+<div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</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;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
+<div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div>
+<div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;                    {</div>
+<div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                }</div>
+<div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;                }</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;        }</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;        <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;        pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;        pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div>
+<div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;        <span class="comment">// pAllocationRequest-&gt;item unused.</span></div>
+<div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;        pAllocationRequest-&gt;type = VmaAllocationRequestType::UpperAddress;</div>
+<div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;    }</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; </div>
+<div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;{</div>
+<div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160; </div>
+<div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="comment">// Try to allocate at the end of 1st vector.</span></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;        VkDeviceSize resultBaseOffset = 0;</div>
+<div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;        <span class="keywordflow">if</span>(!suballocations1st.empty())</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="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
+<div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</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;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
+<div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</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="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;        {</div>
+<div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</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; </div>
+<div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div>
+<div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160; </div>
+<div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations1st.empty())</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;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div>
+<div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;            {</div>
+<div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
+<div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</div>
+<div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;                    <span class="keywordflow">break</span>;</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</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;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</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;        }</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;        <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div>
+<div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;            suballocations2nd.back().offset : size;</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="comment">// There is enough free space at the end after alignment.</span></div>
+<div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;        <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</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;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
+<div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;                        }</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;                    <span class="keywordflow">else</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="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</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; </div>
+<div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;            <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;            pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div>
+<div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
+<div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf1st;</div>
+<div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</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;    <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div>
+<div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160;    <span class="comment">// beginning of 1st vector as the end of free space.</span></div>
+<div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        VMA_ASSERT(!suballocations1st.empty());</div>
+<div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160; </div>
+<div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div>
+<div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</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;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div>
+<div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;        }</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;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
+<div class="line"><a name="l10201"></a><span class="lineno">10201</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</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;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l10204"></a><span class="lineno">10204</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            resultOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160;        }</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="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</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="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</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;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div>
+<div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10225"></a><span class="lineno">10225</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10226"></a><span class="lineno">10226</span>&#160;                    }</div>
+<div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160;                }</div>
+<div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10229"></a><span class="lineno">10229</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l10230"></a><span class="lineno">10230</span>&#160;                    <span class="keywordflow">break</span>;</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;            {</div>
+<div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</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;        }</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;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;        <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</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;        <span class="keywordflow">if</span>(canMakeOtherLost)</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;            <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div>
+<div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</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="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div>
+<div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
+<div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;                <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;                {</div>
+<div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;                    <span class="comment">// No problem.</span></div>
+<div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;                }</div>
+<div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;                <span class="keywordflow">else</span></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(suballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;                    <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l10257"></a><span class="lineno">10257</span>&#160;                        suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                        ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160;                        pAllocationRequest-&gt;sumItemSize += suballoc.size;</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;                    <span class="keywordflow">else</span></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="keywordflow">return</span> <span class="keyword">false</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;                }</div>
+<div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160;                ++index1st;</div>
+<div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;            }</div>
+<div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160; </div>
+<div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;            <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
+<div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
+<div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160;            {</div>
+<div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;                <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</div>
+<div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;                {</div>
+<div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
+<div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;                    {</div>
+<div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;                        <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</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;                            <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div>
+<div class="line"><a name="l10282"></a><span class="lineno">10282</span>&#160;                            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l10283"></a><span class="lineno">10283</span>&#160;                                suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;                            {</div>
+<div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;                                ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;                                pAllocationRequest-&gt;sumItemSize += suballoc.size;</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;                            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;                            {</div>
+<div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                        }</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;                    <span class="keywordflow">else</span></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;                        <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;                    }</div>
+<div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;                    ++index1st;</div>
+<div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;                }</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="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div>
+<div class="line"><a name="l10304"></a><span class="lineno">10304</span>&#160;            <span class="keywordflow">if</span>(index1st == suballocations1st.size() &amp;&amp;</div>
+<div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; size)</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;                <span class="comment">// TODO: This is a known bug that it&#39;s not yet implemented and the allocation is failing.</span></div>
+<div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost.&quot;</span>);</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; </div>
+<div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div>
+<div class="line"><a name="l10313"></a><span class="lineno">10313</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="l10314"></a><span class="lineno">10314</span>&#160;            (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</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;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div>
+<div class="line"><a name="l10321"></a><span class="lineno">10321</span>&#160;                    nextSuballocIndex &lt; suballocations1st.size();</div>
+<div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;                    nextSuballocIndex++)</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> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div>
+<div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160;                    {</div>
+<div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;                        }</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;                    <span class="keywordflow">else</span></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="comment">// Already on next page.</span></div>
+<div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;                    }</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;            }</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;            <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;            pAllocationRequest-&gt;sumFreeSize =</div>
+<div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;                (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div>
+<div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;                - resultBaseOffset</div>
+<div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;                - pAllocationRequest-&gt;sumItemSize;</div>
+<div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf2nd;</div>
+<div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
+<div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;}</div>
+<div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160; </div>
+<div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;{</div>
+<div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;    <span class="keywordflow">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</div>
+<div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;    {</div>
+<div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div>
+<div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;    </div>
+<div class="line"><a name="l10367"></a><span class="lineno">10367</span>&#160;    <span class="comment">// We always start from 1st.</span></div>
+<div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;    SuballocationVectorType* suballocations = &amp;AccessSuballocations1st();</div>
+<div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;    <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div>
+<div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</div>
+<div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160;    {</div>
+<div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;        <span class="keywordflow">if</span>(index == suballocations-&gt;size())</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;            index = 0;</div>
+<div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;            <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div>
+<div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;            <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;                suballocations = &amp;AccessSuballocations2nd();</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="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div>
+<div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;            <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div>
+<div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;            VMA_ASSERT(!suballocations-&gt;empty());</div>
+<div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;        }</div>
+<div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;        VmaSuballocation&amp; suballoc = (*suballocations)[index];</div>
+<div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;        {</div>
+<div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div>
+<div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;                m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;                <span class="keywordflow">if</span>(suballocations == &amp;AccessSuballocations1st())</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;                    ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;                }</div>
+<div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;                <span class="keywordflow">else</span></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;                    ++m_2ndNullItemsCount;</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;                ++madeLostCount;</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="keywordflow">else</span></div>
+<div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;            {</div>
+<div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;            }</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;        ++index;</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; </div>
+<div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;    CleanupAfterFree();</div>
+<div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></div>
+<div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;    </div>
+<div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;}</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;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160;{</div>
+<div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;    uint32_t lostAllocationCount = 0;</div>
+<div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;    </div>
+<div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10424"></a><span class="lineno">10424</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="l10425"></a><span class="lineno">10425</span>&#160;    {</div>
+<div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l10428"></a><span class="lineno">10428</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160;            m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;            ++lostAllocationCount;</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;    }</div>
+<div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160; </div>
+<div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10440"></a><span class="lineno">10440</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="l10441"></a><span class="lineno">10441</span>&#160;    {</div>
+<div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;            ++m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;            m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;            ++lostAllocationCount;</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; </div>
+<div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;    <span class="keywordflow">if</span>(lostAllocationCount)</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;        CleanupAfterFree();</div>
+<div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;    }</div>
+<div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160; </div>
+<div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div>
+<div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;}</div>
+<div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160; </div>
+<div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div>
+<div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;{</div>
+<div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10466"></a><span class="lineno">10466</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="l10467"></a><span class="lineno">10467</span>&#160;    {</div>
+<div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</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">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
+<div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;            {</div>
+<div class="line"><a name="l10478"></a><span class="lineno">10478</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="l10479"></a><span class="lineno">10479</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;            }</div>
+<div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;        }</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; </div>
+<div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10485"></a><span class="lineno">10485</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="l10486"></a><span class="lineno">10486</span>&#160;    {</div>
+<div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;        {</div>
+<div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
+<div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;            {</div>
+<div class="line"><a name="l10497"></a><span class="lineno">10497</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="l10498"></a><span class="lineno">10498</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;            }</div>
+<div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;        }</div>
+<div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;    }</div>
+<div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160; </div>
+<div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div>
+<div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l10509"></a><span class="lineno">10509</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</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">switch</span>(request.type)</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">case</span> VmaAllocationRequestType::UpperAddress:</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;            VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div>
+<div class="line"><a name="l10519"></a><span class="lineno">10519</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="l10520"></a><span class="lineno">10520</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;            suballocations2nd.push_back(newSuballoc);</div>
+<div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div>
+<div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;        }</div>
+<div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div>
+<div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;        {</div>
+<div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160; </div>
+<div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;            VMA_ASSERT(suballocations1st.empty() ||</div>
+<div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;                request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size);</div>
+<div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;            <span class="comment">// Check if it fits before the end of the block.</span></div>
+<div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;            VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</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;            suballocations1st.push_back(newSuballoc);</div>
+<div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;        }</div>
+<div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</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;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10540"></a><span class="lineno">10540</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="l10541"></a><span class="lineno">10541</span>&#160;            VMA_ASSERT(!suballocations1st.empty() &amp;&amp;</div>
+<div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;                request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset);</div>
+<div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160; </div>
+<div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160;            <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
+<div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;            {</div>
+<div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
+<div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;                <span class="comment">// First allocation from second part ring buffer.</span></div>
+<div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;                VMA_ASSERT(suballocations2nd.empty());</div>
+<div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div>
+<div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
+<div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;                <span class="comment">// 2-part ring buffer is already started.</span></div>
+<div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;                VMA_ASSERT(!suballocations2nd.empty());</div>
+<div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
+<div class="line"><a name="l10557"></a><span class="lineno">10557</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="l10558"></a><span class="lineno">10558</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;            <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;                VMA_ASSERT(0);</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;            suballocations2nd.push_back(newSuballoc);</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">break</span>;</div>
+<div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</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; </div>
+<div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;    m_SumFreeSize -= newSuballoc.size;</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;<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="l10574"></a><span class="lineno">10574</span>&#160;{</div>
+<div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;    FreeAtOffset(allocation-&gt;GetOffset());</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; </div>
+<div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</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;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
+<div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;    {</div>
+<div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div>
+<div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</div>
+<div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;        {</div>
+<div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div>
+<div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;            ++m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;        }</div>
+<div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;    }</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="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div>
+<div class="line"><a name="l10599"></a><span class="lineno">10599</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div>
+<div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;    {</div>
+<div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</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;            m_SumFreeSize += lastSuballoc.size;</div>
+<div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;            suballocations2nd.pop_back();</div>
+<div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;        }</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;    <span class="comment">// Last allocation in 1st vector.</span></div>
+<div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</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;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
+<div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</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;            m_SumFreeSize += lastSuballoc.size;</div>
+<div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160;            suballocations1st.pop_back();</div>
+<div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;        }</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; </div>
+<div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;    <span class="comment">// Item from the middle of 1st vector.</span></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;        VmaSuballocation refSuballoc;</div>
+<div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;        refSuballoc.offset = offset;</div>
+<div class="line"><a name="l10628"></a><span class="lineno">10628</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
+<div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;        SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div>
+<div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div>
+<div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;            suballocations1st.end(),</div>
+<div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;            refSuballoc,</div>
+<div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;            VmaSuballocationOffsetLess());</div>
+<div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div>
+<div class="line"><a name="l10635"></a><span class="lineno">10635</span>&#160;        {</div>
+<div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
+<div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160;            <span class="keywordflow">return</span>;</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; </div>
+<div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</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;        <span class="comment">// Item from the middle of 2nd vector.</span></div>
+<div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;        VmaSuballocation refSuballoc;</div>
+<div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;        refSuballoc.offset = offset;</div>
+<div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
+<div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div>
+<div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div>
+<div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div>
+<div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</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;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10657"></a><span class="lineno">10657</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10658"></a><span class="lineno">10658</span>&#160;            ++m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10659"></a><span class="lineno">10659</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
+<div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;        }</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; </div>
+<div class="line"><a name="l10665"></a><span class="lineno">10665</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="l10666"></a><span class="lineno">10666</span>&#160;}</div>
+<div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160; </div>
+<div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10669"></a><span class="lineno">10669</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div>
+<div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</div>
+<div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</div>
+<div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;{</div>
+<div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160; </div>
+<div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;    {</div>
+<div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;        suballocations1st.clear();</div>
+<div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;        suballocations2nd.clear();</div>
+<div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;        m_1stNullItemsBeginCount = 0;</div>
+<div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;        m_1stNullItemsMiddleCount = 0;</div>
+<div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160;        m_2ndNullItemsCount = 0;</div>
+<div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</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;    <span class="keywordflow">else</span></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="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div>
+<div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160; </div>
+<div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div>
+<div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;        {</div>
+<div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;            ++m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;            --m_1stNullItemsMiddleCount;</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; </div>
+<div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;        <span class="comment">// Find more null items at the end of 1st vector.</span></div>
+<div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</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;            --m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10708"></a><span class="lineno">10708</span>&#160;            suballocations1st.pop_back();</div>
+<div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;        }</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">// Find more null items at the end of 2nd vector.</span></div>
+<div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</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;            --m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;            suballocations2nd.pop_back();</div>
+<div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;        }</div>
+<div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160; </div>
+<div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;        <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div>
+<div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;            suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</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;            --m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;            VmaVectorRemove(suballocations2nd, 0);</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="keywordflow">if</span>(ShouldCompact1st())</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;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div>
+<div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10731"></a><span class="lineno">10731</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="l10732"></a><span class="lineno">10732</span>&#160;            {</div>
+<div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;                {</div>
+<div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;                    ++srcIndex;</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">if</span>(dstIndex != srcIndex)</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;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</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;                ++srcIndex;</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;            suballocations1st.resize(nonNullItemCount);</div>
+<div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;            m_1stNullItemsBeginCount = 0;</div>
+<div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;            m_1stNullItemsMiddleCount = 0;</div>
+<div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;        }</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;        <span class="comment">// 2nd vector became empty.</span></div>
+<div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</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;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
+<div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;        }</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">// 1st vector became empty.</span></div>
+<div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</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;            suballocations1st.clear();</div>
+<div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160;            m_1stNullItemsBeginCount = 0;</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;            <span class="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;            {</div>
+<div class="line"><a name="l10762"></a><span class="lineno">10762</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div>
+<div class="line"><a name="l10763"></a><span class="lineno">10763</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
+<div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div>
+<div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</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_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10769"></a><span class="lineno">10769</span>&#160;                    --m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;                }</div>
+<div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;                m_2ndNullItemsCount = 0;</div>
+<div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;                m_1stVectorIndex ^= 1;</div>
+<div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;            }</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;    }</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;    VMA_HEAVY_ASSERT(Validate());</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; </div>
+<div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160; </div>
+<div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</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;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;    m_Root(VMA_NULL),</div>
+<div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;    m_FreeCount(1),</div>
+<div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;    m_SumFreeSize(0)</div>
+<div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;{</div>
+<div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</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;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</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;    DeleteNode(m_Root);</div>
+<div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;}</div>
+<div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160; </div>
+<div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160;{</div>
+<div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;    VmaBlockMetadata::Init(size);</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;    m_UsableSize = VmaPrevPow2(size);</div>
+<div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;    m_SumFreeSize = m_UsableSize;</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="comment">// Calculate m_LevelCount.</span></div>
+<div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;    m_LevelCount = 1;</div>
+<div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div>
+<div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</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;        ++m_LevelCount;</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;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div>
+<div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;    rootNode-&gt;offset = 0;</div>
+<div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div>
+<div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</div>
+<div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160; </div>
+<div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;    m_Root = rootNode;</div>
+<div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;    AddToFreeListFront(0, rootNode);</div>
+<div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;}</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="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;    <span class="comment">// Validate tree.</span></div>
+<div class="line"><a name="l10827"></a><span class="lineno">10827</span>&#160;    ValidationContext ctx;</div>
+<div class="line"><a name="l10828"></a><span class="lineno">10828</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</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;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div>
+<div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;    }</div>
+<div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div>
+<div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</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;    <span class="comment">// Validate free node lists.</span></div>
+<div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</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;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div>
+<div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div>
+<div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160; </div>
+<div class="line"><a name="l10841"></a><span class="lineno">10841</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div>
+<div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;            node != VMA_NULL;</div>
+<div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;            node = node-&gt;free.next)</div>
+<div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;        {</div>
+<div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;            </div>
+<div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div>
+<div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;            {</div>
+<div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;                VMA_VALIDATE(m_FreeList[level].back == node);</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;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;            {</div>
+<div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</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;        }</div>
+<div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;    }</div>
+<div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160; </div>
+<div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;    <span class="comment">// Validate that free lists ar higher levels are empty.</span></div>
+<div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div>
+<div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;    {</div>
+<div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;}</div>
+<div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160; </div>
+<div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</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>(m_FreeList[level].front != VMA_NULL)</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">return</span> LevelToNodeSize(level);</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> 0;</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> 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="l10880"></a><span class="lineno">10880</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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;    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="l10886"></a><span class="lineno">10886</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="l10887"></a><span class="lineno">10887</span>&#160; </div>
+<div class="line"><a name="l10888"></a><span class="lineno">10888</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="l10889"></a><span class="lineno">10889</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="l10890"></a><span class="lineno">10890</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="l10891"></a><span class="lineno">10891</span>&#160; </div>
+<div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</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>(unusableSize &gt; 0)</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;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10897"></a><span class="lineno">10897</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div>
+<div class="line"><a name="l10898"></a><span class="lineno">10898</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="l10899"></a><span class="lineno">10899</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="l10900"></a><span class="lineno">10900</span>&#160;    }</div>
+<div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;}</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="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="l10904"></a><span class="lineno">10904</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
+<div class="line"><a name="l10908"></a><span class="lineno">10908</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div>
+<div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div>
+<div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
+<div class="line"><a name="l10911"></a><span class="lineno">10911</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="l10912"></a><span class="lineno">10912</span>&#160; </div>
+<div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</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;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10916"></a><span class="lineno">10916</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="l10917"></a><span class="lineno">10917</span>&#160;    }</div>
+<div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;}</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="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="l10923"></a><span class="lineno">10923</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10924"></a><span class="lineno">10924</span>&#160;    <span class="comment">// TODO optimize</span></div>
+<div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div>
+<div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;    CalcAllocationStatInfo(stat);</div>
+<div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160; </div>
+<div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;    PrintDetailedMap_Begin(</div>
+<div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;        json,</div>
+<div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div>
+<div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div>
+<div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div>
+<div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160; </div>
+<div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div>
+<div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160; </div>
+<div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
+<div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
+<div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;    {</div>
+<div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;        PrintDetailedMap_UnusedRange(json,</div>
+<div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div>
+<div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;            unusableSize); <span class="comment">// size</span></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; </div>
+<div class="line"><a name="l10944"></a><span class="lineno">10944</span>&#160;    PrintDetailedMap_End(json);</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; </div>
+<div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div>
+<div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;{</div>
+<div class="line"><a name="l10961"></a><span class="lineno">10961</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="l10962"></a><span class="lineno">10962</span>&#160; </div>
+<div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div>
+<div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div>
+<div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div>
+<div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</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;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div>
+<div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div>
+<div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;    }</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>(allocSize &gt; m_UsableSize)</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;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;    }</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="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
+<div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div>
+<div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;    {</div>
+<div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;        <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div>
+<div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;            freeNode != VMA_NULL;</div>
+<div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;            freeNode = freeNode-&gt;free.next)</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;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div>
+<div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;            {</div>
+<div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;                pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div>
+<div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div>
+<div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div>
+<div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</div>
+<div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160; </div>
+<div class="line"><a name="l10998"></a><span class="lineno">10998</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; </div>
+<div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    <span class="comment">/*</span></div>
+<div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
+<div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
+<div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</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;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    <span class="comment">/*</span></div>
+<div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
+<div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
+<div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;    <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div>
+<div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160; </div>
+<div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
+<div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</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;    Node* currNode = m_FreeList[currLevel].front;</div>
+<div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</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;        currNode = currNode-&gt;free.next;</div>
+<div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</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;    </div>
+<div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div>
+<div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</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;        <span class="comment">// currNode is already first free node at currLevel.</span></div>
+<div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div>
+<div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160;        RemoveFromFreeList(currLevel, currNode);</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="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</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;        <span class="comment">// Create two free sub-nodes.</span></div>
+<div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div>
+<div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</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;        leftChild-&gt;offset = currNode-&gt;offset;</div>
+<div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;        leftChild-&gt;parent = currNode;</div>
+<div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;        leftChild-&gt;buddy = rightChild;</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;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div>
+<div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;        rightChild-&gt;parent = currNode;</div>
+<div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;        rightChild-&gt;buddy = leftChild;</div>
+<div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160; </div>
+<div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;        <span class="comment">// Convert current currNode to split type.</span></div>
+<div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div>
+<div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;        currNode-&gt;split.leftChild = leftChild;</div>
+<div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160; </div>
+<div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;        <span class="comment">// Add child nodes to free list. Order is important!</span></div>
+<div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div>
+<div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</div>
+<div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160; </div>
+<div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;        ++m_FreeCount;</div>
+<div class="line"><a name="l11073"></a><span class="lineno">11073</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="l11074"></a><span class="lineno">11074</span>&#160;        ++currLevel;</div>
+<div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;        currNode = m_FreeList[currLevel].front;</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;        <span class="comment">/*</span></div>
+<div class="line"><a name="l11078"></a><span class="lineno">11078</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="l11079"></a><span class="lineno">11079</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div>
+<div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;<span class="comment">        */</span></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; </div>
+<div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;    <span class="comment">// Remove from free list.</span></div>
+<div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div>
+<div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;        currNode != VMA_NULL &amp;&amp;</div>
+<div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;    RemoveFromFreeList(currLevel, currNode);</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;    <span class="comment">// Convert to allocation node.</span></div>
+<div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div>
+<div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</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;    ++m_AllocationCount;</div>
+<div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;    --m_FreeCount;</div>
+<div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;    m_SumFreeSize -= allocSize;</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;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</div>
+<div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;{</div>
+<div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</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;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div>
+<div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;        DeleteNode(node-&gt;split.leftChild);</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; </div>
+<div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</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; </div>
+<div class="line"><a name="l11109"></a><span class="lineno">11109</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="l11110"></a><span class="lineno">11110</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div>
+<div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div>
+<div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div>
+<div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div>
+<div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</div>
+<div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;    {</div>
+<div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div>
+<div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div>
+<div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;        ++ctx.calculatedFreeCount;</div>
+<div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
+<div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;        ++ctx.calculatedAllocationCount;</div>
+<div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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;            <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div>
+<div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div>
+<div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div>
+<div class="line"><a name="l11133"></a><span class="lineno">11133</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div>
+<div class="line"><a name="l11134"></a><span class="lineno">11134</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div>
+<div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;            {</div>
+<div class="line"><a name="l11136"></a><span class="lineno">11136</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="l11137"></a><span class="lineno">11137</span>&#160;            }</div>
+<div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div>
+<div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</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;                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="l11143"></a><span class="lineno">11143</span>&#160;            }</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">break</span>;</div>
+<div class="line"><a name="l11146"></a><span class="lineno">11146</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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="l11153"></a><span class="lineno">11153</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l11154"></a><span class="lineno">11154</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11155"></a><span class="lineno">11155</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="l11156"></a><span class="lineno">11156</span>&#160;    uint32_t level = 0;</div>
+<div class="line"><a name="l11157"></a><span class="lineno">11157</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div>
+<div class="line"><a name="l11158"></a><span class="lineno">11158</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</div>
+<div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;    {</div>
+<div class="line"><a name="l11161"></a><span class="lineno">11161</span>&#160;        ++level;</div>
+<div class="line"><a name="l11162"></a><span class="lineno">11162</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div>
+<div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;    }</div>
+<div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;    <span class="keywordflow">return</span> level;</div>
+<div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;}</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;<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="l11169"></a><span class="lineno">11169</span>&#160;{</div>
+<div class="line"><a name="l11170"></a><span class="lineno">11170</span>&#160;    <span class="comment">// Find node and level.</span></div>
+<div class="line"><a name="l11171"></a><span class="lineno">11171</span>&#160;    Node* node = m_Root;</div>
+<div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;    VkDeviceSize nodeOffset = 0;</div>
+<div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;    uint32_t level = 0;</div>
+<div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div>
+<div class="line"><a name="l11175"></a><span class="lineno">11175</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</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;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l11178"></a><span class="lineno">11178</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</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;            node = node-&gt;split.leftChild;</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;        <span class="keywordflow">else</span></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;            node = node-&gt;split.leftChild-&gt;buddy;</div>
+<div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160;            nodeOffset += nextLevelSize;</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;        ++level;</div>
+<div class="line"><a name="l11188"></a><span class="lineno">11188</span>&#160;        levelNodeSize = nextLevelSize;</div>
+<div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;    }</div>
+<div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160; </div>
+<div class="line"><a name="l11191"></a><span class="lineno">11191</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div>
+<div class="line"><a name="l11192"></a><span class="lineno">11192</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div>
+<div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160; </div>
+<div class="line"><a name="l11194"></a><span class="lineno">11194</span>&#160;    ++m_FreeCount;</div>
+<div class="line"><a name="l11195"></a><span class="lineno">11195</span>&#160;    --m_AllocationCount;</div>
+<div class="line"><a name="l11196"></a><span class="lineno">11196</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div>
+<div class="line"><a name="l11197"></a><span class="lineno">11197</span>&#160; </div>
+<div class="line"><a name="l11198"></a><span class="lineno">11198</span>&#160;    node-&gt;type = Node::TYPE_FREE;</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="comment">// Join free nodes if possible.</span></div>
+<div class="line"><a name="l11201"></a><span class="lineno">11201</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="l11202"></a><span class="lineno">11202</span>&#160;    {</div>
+<div class="line"><a name="l11203"></a><span class="lineno">11203</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div>
+<div class="line"><a name="l11204"></a><span class="lineno">11204</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</div>
+<div class="line"><a name="l11205"></a><span class="lineno">11205</span>&#160; </div>
+<div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div>
+<div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div>
+<div class="line"><a name="l11208"></a><span class="lineno">11208</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</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;        node = parent;</div>
+<div class="line"><a name="l11211"></a><span class="lineno">11211</span>&#160;        --level;</div>
+<div class="line"><a name="l11212"></a><span class="lineno">11212</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="l11213"></a><span class="lineno">11213</span>&#160;        --m_FreeCount;</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;    AddToFreeListFront(level, node);</div>
+<div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160;}</div>
+<div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160; </div>
+<div class="line"><a name="l11219"></a><span class="lineno">11219</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="l11220"></a><span class="lineno">11220</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</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">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l11225"></a><span class="lineno">11225</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div>
+<div class="line"><a name="l11226"></a><span class="lineno">11226</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="l11227"></a><span class="lineno">11227</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="l11228"></a><span class="lineno">11228</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11229"></a><span class="lineno">11229</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
+<div class="line"><a name="l11230"></a><span class="lineno">11230</span>&#160;        {</div>
+<div class="line"><a name="l11231"></a><span class="lineno">11231</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l11232"></a><span class="lineno">11232</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
+<div class="line"><a name="l11233"></a><span class="lineno">11233</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div>
+<div class="line"><a name="l11234"></a><span class="lineno">11234</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="l11235"></a><span class="lineno">11235</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="l11236"></a><span class="lineno">11236</span>&#160; </div>
+<div class="line"><a name="l11237"></a><span class="lineno">11237</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div>
+<div class="line"><a name="l11238"></a><span class="lineno">11238</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 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;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l11241"></a><span class="lineno">11241</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l11242"></a><span class="lineno">11242</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="l11243"></a><span class="lineno">11243</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="l11244"></a><span class="lineno">11244</span>&#160;            }</div>
+<div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;        }</div>
+<div class="line"><a name="l11246"></a><span class="lineno">11246</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11247"></a><span class="lineno">11247</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l11250"></a><span class="lineno">11250</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
+<div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div>
+<div class="line"><a name="l11252"></a><span class="lineno">11252</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l11253"></a><span class="lineno">11253</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div>
+<div class="line"><a name="l11254"></a><span class="lineno">11254</span>&#160;        }</div>
+<div class="line"><a name="l11255"></a><span class="lineno">11255</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11256"></a><span class="lineno">11256</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11257"></a><span class="lineno">11257</span>&#160;        VMA_ASSERT(0);</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;}</div>
+<div class="line"><a name="l11260"></a><span class="lineno">11260</span>&#160; </div>
+<div class="line"><a name="l11261"></a><span class="lineno">11261</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div>
+<div class="line"><a name="l11262"></a><span class="lineno">11262</span>&#160;{</div>
+<div class="line"><a name="l11263"></a><span class="lineno">11263</span>&#160;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</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;    <span class="comment">// List is empty.</span></div>
+<div class="line"><a name="l11266"></a><span class="lineno">11266</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div>
+<div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div>
+<div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div>
+<div class="line"><a name="l11271"></a><span class="lineno">11271</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</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="keywordflow">else</span></div>
+<div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;    {</div>
+<div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div>
+<div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;        node-&gt;free.prev = VMA_NULL;</div>
+<div class="line"><a name="l11277"></a><span class="lineno">11277</span>&#160;        node-&gt;free.next = frontNode;</div>
+<div class="line"><a name="l11278"></a><span class="lineno">11278</span>&#160;        frontNode-&gt;free.prev = node;</div>
+<div class="line"><a name="l11279"></a><span class="lineno">11279</span>&#160;        m_FreeList[level].front = node;</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;}</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="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</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;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</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="comment">// It is at the front.</span></div>
+<div class="line"><a name="l11288"></a><span class="lineno">11288</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].front == node);</div>
+<div class="line"><a name="l11291"></a><span class="lineno">11291</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</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">else</span></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;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div>
+<div class="line"><a name="l11296"></a><span class="lineno">11296</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div>
+<div class="line"><a name="l11297"></a><span class="lineno">11297</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</div>
+<div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;    }</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">// It is at the back.</span></div>
+<div class="line"><a name="l11301"></a><span class="lineno">11301</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</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;        VMA_ASSERT(m_FreeList[level].back == node);</div>
+<div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div>
+<div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;    }</div>
+<div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;    {</div>
+<div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div>
+<div class="line"><a name="l11309"></a><span class="lineno">11309</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div>
+<div class="line"><a name="l11310"></a><span class="lineno">11310</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</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;}</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11315"></a><span class="lineno">11315</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="l11316"></a><span class="lineno">11316</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div>
+<div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;    {</div>
+<div class="line"><a name="l11319"></a><span class="lineno">11319</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l11320"></a><span class="lineno">11320</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div>
+<div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</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;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div>
+<div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l11326"></a><span class="lineno">11326</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</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;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</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;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11332"></a><span class="lineno">11332</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l11335"></a><span class="lineno">11335</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
+<div class="line"><a name="l11336"></a><span class="lineno">11336</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div>
+<div class="line"><a name="l11337"></a><span class="lineno">11337</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l11338"></a><span class="lineno">11338</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</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="keywordflow">break</span>;</div>
+<div class="line"><a name="l11341"></a><span class="lineno">11341</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;        VMA_ASSERT(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;}</div>
+<div class="line"><a name="l11345"></a><span class="lineno">11345</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11346"></a><span class="lineno">11346</span>&#160; </div>
+<div class="line"><a name="l11347"></a><span class="lineno">11347</span>&#160; </div>
+<div class="line"><a name="l11349"></a><span class="lineno">11349</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></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;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l11352"></a><span class="lineno">11352</span>&#160;    m_pMetadata(VMA_NULL),</div>
+<div class="line"><a name="l11353"></a><span class="lineno">11353</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div>
+<div class="line"><a name="l11354"></a><span class="lineno">11354</span>&#160;    m_Id(0),</div>
+<div class="line"><a name="l11355"></a><span class="lineno">11355</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div>
+<div class="line"><a name="l11356"></a><span class="lineno">11356</span>&#160;    m_MapCount(0),</div>
+<div class="line"><a name="l11357"></a><span class="lineno">11357</span>&#160;    m_pMappedData(VMA_NULL)</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;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div>
+<div class="line"><a name="l11362"></a><span class="lineno">11362</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l11363"></a><span class="lineno">11363</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l11364"></a><span class="lineno">11364</span>&#160;    uint32_t newMemoryTypeIndex,</div>
+<div class="line"><a name="l11365"></a><span class="lineno">11365</span>&#160;    VkDeviceMemory newMemory,</div>
+<div class="line"><a name="l11366"></a><span class="lineno">11366</span>&#160;    VkDeviceSize newSize,</div>
+<div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div>
+<div class="line"><a name="l11368"></a><span class="lineno">11368</span>&#160;    uint32_t algorithm)</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;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l11371"></a><span class="lineno">11371</span>&#160; </div>
+<div class="line"><a name="l11372"></a><span class="lineno">11372</span>&#160;    m_hParentPool = hParentPool;</div>
+<div class="line"><a name="l11373"></a><span class="lineno">11373</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div>
+<div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;    m_Id = id;</div>
+<div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160;    m_hMemory = newMemory;</div>
+<div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160; </div>
+<div class="line"><a name="l11377"></a><span class="lineno">11377</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</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="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="l11380"></a><span class="lineno">11380</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div>
+<div class="line"><a name="l11381"></a><span class="lineno">11381</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11382"></a><span class="lineno">11382</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="l11383"></a><span class="lineno">11383</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div>
+<div class="line"><a name="l11384"></a><span class="lineno">11384</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11385"></a><span class="lineno">11385</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11386"></a><span class="lineno">11386</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l11387"></a><span class="lineno">11387</span>&#160;        <span class="comment">// Fall-through.</span></div>
+<div class="line"><a name="l11388"></a><span class="lineno">11388</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l11389"></a><span class="lineno">11389</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</div>
+<div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;    }</div>
+<div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;    m_pMetadata-&gt;Init(newSize);</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; </div>
+<div class="line"><a name="l11394"></a><span class="lineno">11394</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="l11395"></a><span class="lineno">11395</span>&#160;{</div>
+<div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div>
+<div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div>
+<div class="line"><a name="l11398"></a><span class="lineno">11398</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="l11399"></a><span class="lineno">11399</span>&#160; </div>
+<div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div>
+<div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160;    m_hMemory = VK_NULL_HANDLE;</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;    vma_delete(allocator, m_pMetadata);</div>
+<div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;    m_pMetadata = VMA_NULL;</div>
+<div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;}</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;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11410"></a><span class="lineno">11410</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div>
+<div class="line"><a name="l11411"></a><span class="lineno">11411</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</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="keywordflow">return</span> m_pMetadata-&gt;Validate();</div>
+<div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;}</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;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div>
+<div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l11421"></a><span class="lineno">11421</span>&#160;    {</div>
+<div class="line"><a name="l11422"></a><span class="lineno">11422</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l11423"></a><span class="lineno">11423</span>&#160;    }</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;    res = m_pMetadata-&gt;CheckCorruption(pData);</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;    Unmap(hAllocator, 1);</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="keywordflow">return</span> res;</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; </div>
+<div class="line"><a name="l11432"></a><span class="lineno">11432</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="l11433"></a><span class="lineno">11433</span>&#160;{</div>
+<div class="line"><a name="l11434"></a><span class="lineno">11434</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div>
+<div class="line"><a name="l11435"></a><span class="lineno">11435</span>&#160;    {</div>
+<div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160;    }</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;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l11440"></a><span class="lineno">11440</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div>
+<div class="line"><a name="l11441"></a><span class="lineno">11441</span>&#160;    {</div>
+<div class="line"><a name="l11442"></a><span class="lineno">11442</span>&#160;        m_MapCount += count;</div>
+<div class="line"><a name="l11443"></a><span class="lineno">11443</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div>
+<div class="line"><a name="l11444"></a><span class="lineno">11444</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div>
+<div class="line"><a name="l11445"></a><span class="lineno">11445</span>&#160;        {</div>
+<div class="line"><a name="l11446"></a><span class="lineno">11446</span>&#160;            *ppData = m_pMappedData;</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;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11449"></a><span class="lineno">11449</span>&#160;    }</div>
+<div class="line"><a name="l11450"></a><span class="lineno">11450</span>&#160;    <span class="keywordflow">else</span></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;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
+<div class="line"><a name="l11453"></a><span class="lineno">11453</span>&#160;            hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l11454"></a><span class="lineno">11454</span>&#160;            m_hMemory,</div>
+<div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;            0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l11456"></a><span class="lineno">11456</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l11457"></a><span class="lineno">11457</span>&#160;            0, <span class="comment">// flags</span></div>
+<div class="line"><a name="l11458"></a><span class="lineno">11458</span>&#160;            &amp;m_pMappedData);</div>
+<div class="line"><a name="l11459"></a><span class="lineno">11459</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div>
+<div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160;        {</div>
+<div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</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;                *ppData = m_pMappedData;</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;            m_MapCount = count;</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;        <span class="keywordflow">return</span> result;</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;<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="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">if</span>(count == 0)</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;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11476"></a><span class="lineno">11476</span>&#160;    }</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;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</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;        m_MapCount -= count;</div>
+<div class="line"><a name="l11482"></a><span class="lineno">11482</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div>
+<div class="line"><a name="l11483"></a><span class="lineno">11483</span>&#160;        {</div>
+<div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160;            m_pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l11485"></a><span class="lineno">11485</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</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="keywordflow">else</span></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;        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="l11491"></a><span class="lineno">11491</span>&#160;    }</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; </div>
+<div class="line"><a name="l11494"></a><span class="lineno">11494</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="l11495"></a><span class="lineno">11495</span>&#160;{</div>
+<div class="line"><a name="l11496"></a><span class="lineno">11496</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="l11497"></a><span class="lineno">11497</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</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">void</span>* pData;</div>
+<div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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">return</span> res;</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; </div>
+<div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</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;    Unmap(hAllocator, 1);</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">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l11514"></a><span class="lineno">11514</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="l11515"></a><span class="lineno">11515</span>&#160;{</div>
+<div class="line"><a name="l11516"></a><span class="lineno">11516</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="l11517"></a><span class="lineno">11517</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l11518"></a><span class="lineno">11518</span>&#160; </div>
+<div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;    <span class="keywordtype">void</span>* pData;</div>
+<div class="line"><a name="l11520"></a><span class="lineno">11520</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l11521"></a><span class="lineno">11521</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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="keywordflow">return</span> res;</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; </div>
+<div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</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;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</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; </div>
+<div class="line"><a name="l11535"></a><span class="lineno">11535</span>&#160;    Unmap(hAllocator, 1);</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;    <span class="keywordflow">return</span> VK_SUCCESS;</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;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div>
+<div class="line"><a name="l11541"></a><span class="lineno">11541</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l11542"></a><span class="lineno">11542</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l11543"></a><span class="lineno">11543</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l11544"></a><span class="lineno">11544</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l11545"></a><span class="lineno">11545</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
+<div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
+<div class="line"><a name="l11549"></a><span class="lineno">11549</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
+<div class="line"><a name="l11550"></a><span class="lineno">11550</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
+<div class="line"><a name="l11551"></a><span class="lineno">11551</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
+<div class="line"><a name="l11552"></a><span class="lineno">11552</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="l11553"></a><span class="lineno">11553</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l11554"></a><span class="lineno">11554</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</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; </div>
+<div class="line"><a name="l11557"></a><span class="lineno">11557</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div>
+<div class="line"><a name="l11558"></a><span class="lineno">11558</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l11560"></a><span class="lineno">11560</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l11561"></a><span class="lineno">11561</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l11562"></a><span class="lineno">11562</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
+<div class="line"><a name="l11565"></a><span class="lineno">11565</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
+<div class="line"><a name="l11566"></a><span class="lineno">11566</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
+<div class="line"><a name="l11567"></a><span class="lineno">11567</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
+<div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
+<div class="line"><a name="l11569"></a><span class="lineno">11569</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="l11570"></a><span class="lineno">11570</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l11571"></a><span class="lineno">11571</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</div>
+<div class="line"><a name="l11572"></a><span class="lineno">11572</span>&#160;}</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;<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="l11575"></a><span class="lineno">11575</span>&#160;{</div>
+<div class="line"><a name="l11576"></a><span class="lineno">11576</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div>
+<div class="line"><a name="l11577"></a><span class="lineno">11577</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;}</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;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div>
+<div class="line"><a name="l11582"></a><span class="lineno">11582</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="l11583"></a><span class="lineno">11583</span>&#160;{</div>
+<div class="line"><a name="l11584"></a><span class="lineno">11584</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="l11585"></a><span class="lineno">11585</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="l11586"></a><span class="lineno">11586</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="l11587"></a><span class="lineno">11587</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="l11588"></a><span class="lineno">11588</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="l11589"></a><span class="lineno">11589</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="l11590"></a><span class="lineno">11590</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="l11591"></a><span class="lineno">11591</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="l11592"></a><span class="lineno">11592</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="l11593"></a><span class="lineno">11593</span>&#160;}</div>
+<div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160; </div>
+<div class="line"><a name="l11595"></a><span class="lineno">11595</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="l11596"></a><span class="lineno">11596</span>&#160;{</div>
+<div class="line"><a name="l11597"></a><span class="lineno">11597</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="l11598"></a><span class="lineno">11598</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="l11599"></a><span class="lineno">11599</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="l11600"></a><span class="lineno">11600</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="l11601"></a><span class="lineno">11601</span>&#160;}</div>
+<div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160; </div>
+<div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;VmaPool_T::VmaPool_T(</div>
+<div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l11605"></a><span class="lineno">11605</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="l11606"></a><span class="lineno">11606</span>&#160;    VkDeviceSize preferredBlockSize) :</div>
+<div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;    m_BlockVector(</div>
+<div class="line"><a name="l11608"></a><span class="lineno">11608</span>&#160;        hAllocator,</div>
+<div class="line"><a name="l11609"></a><span class="lineno">11609</span>&#160;        this, <span class="comment">// hParentPool</span></div>
+<div class="line"><a name="l11610"></a><span class="lineno">11610</span>&#160;        createInfo.memoryTypeIndex,</div>
+<div class="line"><a name="l11611"></a><span class="lineno">11611</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div>
+<div class="line"><a name="l11612"></a><span class="lineno">11612</span>&#160;        createInfo.minBlockCount,</div>
+<div class="line"><a name="l11613"></a><span class="lineno">11613</span>&#160;        createInfo.maxBlockCount,</div>
+<div class="line"><a name="l11614"></a><span class="lineno">11614</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="l11615"></a><span class="lineno">11615</span>&#160;        createInfo.frameInUseCount,</div>
+<div class="line"><a name="l11616"></a><span class="lineno">11616</span>&#160;        true, <span class="comment">// isCustomPool</span></div>
+<div class="line"><a name="l11617"></a><span class="lineno">11617</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div>
+<div class="line"><a name="l11618"></a><span class="lineno">11618</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="l11619"></a><span class="lineno">11619</span>&#160;    m_Id(0)</div>
+<div class="line"><a name="l11620"></a><span class="lineno">11620</span>&#160;{</div>
+<div class="line"><a name="l11621"></a><span class="lineno">11621</span>&#160;}</div>
+<div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160; </div>
+<div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160;VmaPool_T::~VmaPool_T()</div>
+<div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160;{</div>
+<div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;}</div>
+<div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160; </div>
+<div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11628"></a><span class="lineno">11628</span>&#160; </div>
+<div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160; </div>
+<div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;VmaBlockVector::VmaBlockVector(</div>
+<div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l11633"></a><span class="lineno">11633</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l11634"></a><span class="lineno">11634</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;    VkDeviceSize preferredBlockSize,</div>
+<div class="line"><a name="l11636"></a><span class="lineno">11636</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div>
+<div class="line"><a name="l11637"></a><span class="lineno">11637</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div>
+<div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l11639"></a><span class="lineno">11639</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11640"></a><span class="lineno">11640</span>&#160;    <span class="keywordtype">bool</span> isCustomPool,</div>
+<div class="line"><a name="l11641"></a><span class="lineno">11641</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div>
+<div class="line"><a name="l11642"></a><span class="lineno">11642</span>&#160;    uint32_t algorithm) :</div>
+<div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;    m_hParentPool(hParentPool),</div>
+<div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div>
+<div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div>
+<div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;    m_MinBlockCount(minBlockCount),</div>
+<div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;    m_MaxBlockCount(maxBlockCount),</div>
+<div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div>
+<div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;    m_FrameInUseCount(frameInUseCount),</div>
+<div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160;    m_IsCustomPool(isCustomPool),</div>
+<div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div>
+<div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;    m_Algorithm(algorithm),</div>
+<div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;    m_HasEmptyBlock(false),</div>
+<div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l11656"></a><span class="lineno">11656</span>&#160;    m_NextBlockId(0)</div>
+<div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;{</div>
+<div class="line"><a name="l11658"></a><span class="lineno">11658</span>&#160;}</div>
+<div class="line"><a name="l11659"></a><span class="lineno">11659</span>&#160; </div>
+<div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160;VmaBlockVector::~VmaBlockVector()</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</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;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div>
+<div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;    }</div>
+<div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;}</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;VkResult VmaBlockVector::CreateMinBlocks()</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div>
+<div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160;    {</div>
+<div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div>
+<div class="line"><a name="l11674"></a><span class="lineno">11674</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l11675"></a><span class="lineno">11675</span>&#160;        {</div>
+<div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;            <span class="keywordflow">return</span> res;</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;    }</div>
+<div class="line"><a name="l11679"></a><span class="lineno">11679</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l11682"></a><span class="lineno">11682</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="l11683"></a><span class="lineno">11683</span>&#160;{</div>
+<div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l11687"></a><span class="lineno">11687</span>&#160; </div>
+<div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div>
+<div class="line"><a name="l11689"></a><span class="lineno">11689</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div>
+<div class="line"><a name="l11690"></a><span class="lineno">11690</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div>
+<div class="line"><a name="l11691"></a><span class="lineno">11691</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l11692"></a><span class="lineno">11692</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</div>
+<div class="line"><a name="l11694"></a><span class="lineno">11694</span>&#160; </div>
+<div class="line"><a name="l11695"></a><span class="lineno">11695</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;    {</div>
+<div class="line"><a name="l11697"></a><span class="lineno">11697</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l11698"></a><span class="lineno">11698</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</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;}</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;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div>
+<div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11706"></a><span class="lineno">11706</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="l11707"></a><span class="lineno">11707</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div>
+<div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div>
+<div class="line"><a name="l11709"></a><span class="lineno">11709</span>&#160;        (m_Algorithm == 0 || m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>) &amp;&amp;</div>
+<div class="line"><a name="l11710"></a><span class="lineno">11710</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</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="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div>
+<div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160; </div>
+<div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;VkResult VmaBlockVector::Allocate(</div>
+<div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11717"></a><span class="lineno">11717</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l11718"></a><span class="lineno">11718</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l11719"></a><span class="lineno">11719</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="l11720"></a><span class="lineno">11720</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;{</div>
+<div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;    VkResult res = VK_SUCCESS;</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="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;    {</div>
+<div class="line"><a name="l11729"></a><span class="lineno">11729</span>&#160;        size = VmaAlignUp&lt;VkDeviceSize&gt;(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
+<div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160;        alignment = VmaAlignUp&lt;VkDeviceSize&gt;(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</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; </div>
+<div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;    {</div>
+<div class="line"><a name="l11734"></a><span class="lineno">11734</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l11735"></a><span class="lineno">11735</span>&#160;        <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;        {</div>
+<div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;            res = AllocatePage(</div>
+<div class="line"><a name="l11738"></a><span class="lineno">11738</span>&#160;                currentFrameIndex,</div>
+<div class="line"><a name="l11739"></a><span class="lineno">11739</span>&#160;                size,</div>
+<div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160;                alignment,</div>
+<div class="line"><a name="l11741"></a><span class="lineno">11741</span>&#160;                createInfo,</div>
+<div class="line"><a name="l11742"></a><span class="lineno">11742</span>&#160;                suballocType,</div>
+<div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;                pAllocations + allocIndex);</div>
+<div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;            {</div>
+<div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;                <span class="keywordflow">break</span>;</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;        }</div>
+<div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;    }</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;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l11754"></a><span class="lineno">11754</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l11755"></a><span class="lineno">11755</span>&#160;        {</div>
+<div class="line"><a name="l11756"></a><span class="lineno">11756</span>&#160;            Free(pAllocations[allocIndex]);</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;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</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; </div>
+<div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;    <span class="keywordflow">return</span> res;</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; </div>
+<div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;VkResult VmaBlockVector::AllocatePage(</div>
+<div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l11767"></a><span class="lineno">11767</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l11768"></a><span class="lineno">11768</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="l11769"></a><span class="lineno">11769</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l11770"></a><span class="lineno">11770</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</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="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="l11773"></a><span class="lineno">11773</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="l11774"></a><span class="lineno">11774</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="l11775"></a><span class="lineno">11775</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="l11776"></a><span class="lineno">11776</span>&#160;    </div>
+<div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> withinBudget = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0;</div>
+<div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;    VkDeviceSize freeMemory;</div>
+<div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160;    {</div>
+<div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;        m_hAllocator-&gt;GetBudget(&amp;heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;        freeMemory = (heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> &lt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>) ? (heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> - heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>) : 0;</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="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div>
+<div class="line"><a name="l11787"></a><span class="lineno">11787</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="l11788"></a><span class="lineno">11788</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount) &amp;&amp;</div>
+<div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;        freeMemory &gt;= size;</div>
+<div class="line"><a name="l11790"></a><span class="lineno">11790</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="l11791"></a><span class="lineno">11791</span>&#160; </div>
+<div class="line"><a name="l11792"></a><span class="lineno">11792</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="l11793"></a><span class="lineno">11793</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div>
+<div class="line"><a name="l11794"></a><span class="lineno">11794</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="l11795"></a><span class="lineno">11795</span>&#160;    {</div>
+<div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;    }</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;    <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div>
+<div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div>
+<div class="line"><a name="l11801"></a><span class="lineno">11801</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="l11802"></a><span class="lineno">11802</span>&#160;    {</div>
+<div class="line"><a name="l11803"></a><span class="lineno">11803</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</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; </div>
+<div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;    <span class="comment">// Validate strategy.</span></div>
+<div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160;    <span class="keywordflow">switch</span>(strategy)</div>
+<div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;    {</div>
+<div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l11810"></a><span class="lineno">11810</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="l11811"></a><span class="lineno">11811</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11812"></a><span class="lineno">11812</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="l11813"></a><span class="lineno">11813</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="l11814"></a><span class="lineno">11814</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="l11815"></a><span class="lineno">11815</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11817"></a><span class="lineno">11817</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l11818"></a><span class="lineno">11818</span>&#160;    }</div>
+<div class="line"><a name="l11819"></a><span class="lineno">11819</span>&#160; </div>
+<div class="line"><a name="l11820"></a><span class="lineno">11820</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="l11821"></a><span class="lineno">11821</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</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;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</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="comment">/*</span></div>
+<div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div>
+<div class="line"><a name="l11828"></a><span class="lineno">11828</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="l11829"></a><span class="lineno">11829</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div>
+<div class="line"><a name="l11830"></a><span class="lineno">11830</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div>
+<div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;    {</div>
+<div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div>
+<div class="line"><a name="l11834"></a><span class="lineno">11834</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="l11835"></a><span class="lineno">11835</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="l11836"></a><span class="lineno">11836</span>&#160; </div>
+<div class="line"><a name="l11837"></a><span class="lineno">11837</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="l11838"></a><span class="lineno">11838</span>&#160;        {</div>
+<div class="line"><a name="l11839"></a><span class="lineno">11839</span>&#160;            <span class="comment">// Use only last block.</span></div>
+<div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</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;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div>
+<div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;                VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;                VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;                    pCurrBlock,</div>
+<div class="line"><a name="l11846"></a><span class="lineno">11846</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l11847"></a><span class="lineno">11847</span>&#160;                    size,</div>
+<div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;                    alignment,</div>
+<div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;                    allocFlagsCopy,</div>
+<div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;                    strategy,</div>
+<div class="line"><a name="l11853"></a><span class="lineno">11853</span>&#160;                    pAllocation);</div>
+<div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</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;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from last block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;                }</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="keywordflow">else</span></div>
+<div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;        {</div>
+<div class="line"><a name="l11863"></a><span class="lineno">11863</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="l11864"></a><span class="lineno">11864</span>&#160;            {</div>
+<div class="line"><a name="l11865"></a><span class="lineno">11865</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="l11866"></a><span class="lineno">11866</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="l11867"></a><span class="lineno">11867</span>&#160;                {</div>
+<div class="line"><a name="l11868"></a><span class="lineno">11868</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;                    VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l11871"></a><span class="lineno">11871</span>&#160;                        pCurrBlock,</div>
+<div class="line"><a name="l11872"></a><span class="lineno">11872</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;                        size,</div>
+<div class="line"><a name="l11874"></a><span class="lineno">11874</span>&#160;                        alignment,</div>
+<div class="line"><a name="l11875"></a><span class="lineno">11875</span>&#160;                        allocFlagsCopy,</div>
+<div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l11878"></a><span class="lineno">11878</span>&#160;                        strategy,</div>
+<div class="line"><a name="l11879"></a><span class="lineno">11879</span>&#160;                        pAllocation);</div>
+<div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</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;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</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;                }</div>
+<div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;            }</div>
+<div class="line"><a name="l11887"></a><span class="lineno">11887</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></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;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
+<div class="line"><a name="l11890"></a><span class="lineno">11890</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</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;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l11894"></a><span class="lineno">11894</span>&#160;                    VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l11895"></a><span class="lineno">11895</span>&#160;                        pCurrBlock,</div>
+<div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l11897"></a><span class="lineno">11897</span>&#160;                        size,</div>
+<div class="line"><a name="l11898"></a><span class="lineno">11898</span>&#160;                        alignment,</div>
+<div class="line"><a name="l11899"></a><span class="lineno">11899</span>&#160;                        allocFlagsCopy,</div>
+<div class="line"><a name="l11900"></a><span class="lineno">11900</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;                        strategy,</div>
+<div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;                        pAllocation);</div>
+<div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;                    {</div>
+<div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l11907"></a><span class="lineno">11907</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</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;                }</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;        }</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;        <span class="comment">// 2. Try to create new block.</span></div>
+<div class="line"><a name="l11914"></a><span class="lineno">11914</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</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;            <span class="comment">// Calculate optimal size for new block.</span></div>
+<div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div>
+<div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;            uint32_t newBlockSizeShift = 0;</div>
+<div class="line"><a name="l11919"></a><span class="lineno">11919</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</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;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</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="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div>
+<div class="line"><a name="l11924"></a><span class="lineno">11924</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div>
+<div class="line"><a name="l11925"></a><span class="lineno">11925</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="l11926"></a><span class="lineno">11926</span>&#160;                {</div>
+<div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</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;                        newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l11931"></a><span class="lineno">11931</span>&#160;                        ++newBlockSizeShift;</div>
+<div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;                    }</div>
+<div class="line"><a name="l11933"></a><span class="lineno">11933</span>&#160;                    <span class="keywordflow">else</span></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">break</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;                }</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;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div>
+<div class="line"><a name="l11941"></a><span class="lineno">11941</span>&#160;            VkResult res = newBlockSize &lt;= freeMemory ?</div>
+<div class="line"><a name="l11942"></a><span class="lineno">11942</span>&#160;                CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l11943"></a><span class="lineno">11943</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="l11944"></a><span class="lineno">11944</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</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;                <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</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;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div>
+<div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;                    {</div>
+<div class="line"><a name="l11951"></a><span class="lineno">11951</span>&#160;                        newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l11952"></a><span class="lineno">11952</span>&#160;                        ++newBlockSizeShift;</div>
+<div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;                        res = newBlockSize &lt;= freeMemory ?</div>
+<div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;                            CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160;                    }</div>
+<div class="line"><a name="l11956"></a><span class="lineno">11956</span>&#160;                    <span class="keywordflow">else</span></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;                        <span class="keywordflow">break</span>;</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;                }</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; </div>
+<div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</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;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div>
+<div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</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;                res = AllocateFromBlock(</div>
+<div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;                    pBlock,</div>
+<div class="line"><a name="l11970"></a><span class="lineno">11970</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l11971"></a><span class="lineno">11971</span>&#160;                    size,</div>
+<div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;                    alignment,</div>
+<div class="line"><a name="l11973"></a><span class="lineno">11973</span>&#160;                    allocFlagsCopy,</div>
+<div class="line"><a name="l11974"></a><span class="lineno">11974</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l11975"></a><span class="lineno">11975</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l11976"></a><span class="lineno">11976</span>&#160;                    strategy,</div>
+<div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;                    pAllocation);</div>
+<div class="line"><a name="l11978"></a><span class="lineno">11978</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l11979"></a><span class="lineno">11979</span>&#160;                {</div>
+<div class="line"><a name="l11980"></a><span class="lineno">11980</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block #%u Size=%llu&quot;</span>, pBlock-&gt;GetId(), newBlockSize);</div>
+<div class="line"><a name="l11981"></a><span class="lineno">11981</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11982"></a><span class="lineno">11982</span>&#160;                }</div>
+<div class="line"><a name="l11983"></a><span class="lineno">11983</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div>
+<div class="line"><a name="l11986"></a><span class="lineno">11986</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l11987"></a><span class="lineno">11987</span>&#160;                }</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;        }</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; </div>
+<div class="line"><a name="l11992"></a><span class="lineno">11992</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div>
+<div class="line"><a name="l11993"></a><span class="lineno">11993</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</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;        uint32_t tryIndex = 0;</div>
+<div class="line"><a name="l11996"></a><span class="lineno">11996</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</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;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div>
+<div class="line"><a name="l11999"></a><span class="lineno">11999</span>&#160;            VmaAllocationRequest bestRequest = {};</div>
+<div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</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="comment">// 1. Search existing allocations.</span></div>
+<div class="line"><a name="l12003"></a><span class="lineno">12003</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="l12004"></a><span class="lineno">12004</span>&#160;            {</div>
+<div class="line"><a name="l12005"></a><span class="lineno">12005</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="l12006"></a><span class="lineno">12006</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="l12007"></a><span class="lineno">12007</span>&#160;                {</div>
+<div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12009"></a><span class="lineno">12009</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12010"></a><span class="lineno">12010</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12011"></a><span class="lineno">12011</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l12012"></a><span class="lineno">12012</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;                        m_FrameInUseCount,</div>
+<div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;                        m_BufferImageGranularity,</div>
+<div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;                        size,</div>
+<div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160;                        alignment,</div>
+<div class="line"><a name="l12017"></a><span class="lineno">12017</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="l12018"></a><span class="lineno">12018</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l12019"></a><span class="lineno">12019</span>&#160;                        canMakeOtherLost,</div>
+<div class="line"><a name="l12020"></a><span class="lineno">12020</span>&#160;                        strategy,</div>
+<div class="line"><a name="l12021"></a><span class="lineno">12021</span>&#160;                        &amp;currRequest))</div>
+<div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160;                    {</div>
+<div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;                            currRequestCost &lt; bestRequestCost)</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;                            pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;                            bestRequest = currRequest;</div>
+<div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;                            bestRequestCost = currRequestCost;</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;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</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="keywordflow">break</span>;</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;                    }</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;            }</div>
+<div class="line"><a name="l12039"></a><span class="lineno">12039</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l12040"></a><span class="lineno">12040</span>&#160;            {</div>
+<div class="line"><a name="l12041"></a><span class="lineno">12041</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="l12042"></a><span class="lineno">12042</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</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;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12046"></a><span class="lineno">12046</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12047"></a><span class="lineno">12047</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l12049"></a><span class="lineno">12049</span>&#160;                        m_FrameInUseCount,</div>
+<div class="line"><a name="l12050"></a><span class="lineno">12050</span>&#160;                        m_BufferImageGranularity,</div>
+<div class="line"><a name="l12051"></a><span class="lineno">12051</span>&#160;                        size,</div>
+<div class="line"><a name="l12052"></a><span class="lineno">12052</span>&#160;                        alignment,</div>
+<div class="line"><a name="l12053"></a><span class="lineno">12053</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="l12054"></a><span class="lineno">12054</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l12055"></a><span class="lineno">12055</span>&#160;                        canMakeOtherLost,</div>
+<div class="line"><a name="l12056"></a><span class="lineno">12056</span>&#160;                        strategy,</div>
+<div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160;                        &amp;currRequest))</div>
+<div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;                    {</div>
+<div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div>
+<div class="line"><a name="l12062"></a><span class="lineno">12062</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="l12063"></a><span class="lineno">12063</span>&#160;                        {</div>
+<div class="line"><a name="l12064"></a><span class="lineno">12064</span>&#160;                            pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;                            bestRequest = currRequest;</div>
+<div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;                            bestRequestCost = currRequestCost;</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;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div>
+<div class="line"><a name="l12069"></a><span class="lineno">12069</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="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">break</span>;</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;                        }</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;                }</div>
+<div class="line"><a name="l12076"></a><span class="lineno">12076</span>&#160;            }</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;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div>
+<div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;            {</div>
+<div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160;                <span class="keywordflow">if</span>(mapped)</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;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l12083"></a><span class="lineno">12083</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</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="keywordflow">return</span> res;</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;                }</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="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l12090"></a><span class="lineno">12090</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l12091"></a><span class="lineno">12091</span>&#160;                    m_FrameInUseCount,</div>
+<div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;                    &amp;bestRequest))</div>
+<div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;                {</div>
+<div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div>
+<div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
+<div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;                    {</div>
+<div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;                    }</div>
+<div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div>
+<div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;                    *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;                    (*pAllocation)-&gt;Ctor(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div>
+<div class="line"><a name="l12104"></a><span class="lineno">12104</span>&#160;                        pBestRequestBlock,</div>
+<div class="line"><a name="l12105"></a><span class="lineno">12105</span>&#160;                        bestRequest.offset,</div>
+<div class="line"><a name="l12106"></a><span class="lineno">12106</span>&#160;                        alignment,</div>
+<div class="line"><a name="l12107"></a><span class="lineno">12107</span>&#160;                        size,</div>
+<div class="line"><a name="l12108"></a><span class="lineno">12108</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l12109"></a><span class="lineno">12109</span>&#160;                        mapped,</div>
+<div class="line"><a name="l12110"></a><span class="lineno">12110</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="l12111"></a><span class="lineno">12111</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div>
+<div class="line"><a name="l12112"></a><span class="lineno">12112</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block&quot;</span>);</div>
+<div class="line"><a name="l12113"></a><span class="lineno">12113</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="l12114"></a><span class="lineno">12114</span>&#160;                    m_hAllocator-&gt;m_Budget.m_AllocationBytes[m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex)] += size;</div>
+<div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;                    ++m_hAllocator-&gt;m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</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;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;                    }</div>
+<div class="line"><a name="l12120"></a><span class="lineno">12120</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12121"></a><span class="lineno">12121</span>&#160;                    {</div>
+<div class="line"><a name="l12122"></a><span class="lineno">12122</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div>
+<div class="line"><a name="l12123"></a><span class="lineno">12123</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="l12124"></a><span class="lineno">12124</span>&#160;                    }</div>
+<div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;                }</div>
+<div class="line"><a name="l12127"></a><span class="lineno">12127</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="l12128"></a><span class="lineno">12128</span>&#160;            }</div>
+<div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;            {</div>
+<div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div>
+<div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;                <span class="keywordflow">break</span>;</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;        }</div>
+<div class="line"><a name="l12135"></a><span class="lineno">12135</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div>
+<div class="line"><a name="l12136"></a><span class="lineno">12136</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div>
+<div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div>
+<div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</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="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</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;    }</div>
+<div class="line"><a name="l12143"></a><span class="lineno">12143</span>&#160; </div>
+<div class="line"><a name="l12144"></a><span class="lineno">12144</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12145"></a><span class="lineno">12145</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockVector::Free(</div>
+<div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;{</div>
+<div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div>
+<div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160; </div>
+<div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;    <span class="comment">// Scope for lock.</span></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;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</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;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</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="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160;        {</div>
+<div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div>
+<div class="line"><a name="l12161"></a><span class="lineno">12161</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="l12162"></a><span class="lineno">12162</span>&#160;        }</div>
+<div class="line"><a name="l12163"></a><span class="lineno">12163</span>&#160; </div>
+<div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</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;            pBlock-&gt;Unmap(m_hAllocator, 1);</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;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div>
+<div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160; </div>
+<div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, m_MemoryTypeIndex);</div>
+<div class="line"><a name="l12173"></a><span class="lineno">12173</span>&#160; </div>
+<div class="line"><a name="l12174"></a><span class="lineno">12174</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div>
+<div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</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;            <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="l12178"></a><span class="lineno">12178</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div>
+<div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;            {</div>
+<div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;                pBlockToDelete = pBlock;</div>
+<div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;                Remove(pBlock);</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="comment">// We now have first empty block.</span></div>
+<div class="line"><a name="l12184"></a><span class="lineno">12184</span>&#160;            <span class="keywordflow">else</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;                m_HasEmptyBlock = <span class="keyword">true</span>;</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;        }</div>
+<div class="line"><a name="l12189"></a><span class="lineno">12189</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="l12190"></a><span class="lineno">12190</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div>
+<div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</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;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div>
+<div class="line"><a name="l12194"></a><span class="lineno">12194</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="l12195"></a><span class="lineno">12195</span>&#160;            {</div>
+<div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160;                pBlockToDelete = pLastBlock;</div>
+<div class="line"><a name="l12197"></a><span class="lineno">12197</span>&#160;                m_Blocks.pop_back();</div>
+<div class="line"><a name="l12198"></a><span class="lineno">12198</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</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;        }</div>
+<div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160; </div>
+<div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;        IncrementallySortBlocks();</div>
+<div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160;    }</div>
+<div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160; </div>
+<div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div>
+<div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;    <span class="comment">// lock, for performance reason.</span></div>
+<div class="line"><a name="l12207"></a><span class="lineno">12207</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div>
+<div class="line"><a name="l12208"></a><span class="lineno">12208</span>&#160;    {</div>
+<div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div>
+<div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l12211"></a><span class="lineno">12211</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</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;}</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;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12216"></a><span class="lineno">12216</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12217"></a><span class="lineno">12217</span>&#160;    VkDeviceSize result = 0;</div>
+<div class="line"><a name="l12218"></a><span class="lineno">12218</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l12219"></a><span class="lineno">12219</span>&#160;    {</div>
+<div class="line"><a name="l12220"></a><span class="lineno">12220</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div>
+<div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</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">break</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;    }</div>
+<div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;}</div>
+<div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160; </div>
+<div class="line"><a name="l12229"></a><span class="lineno">12229</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div>
+<div class="line"><a name="l12230"></a><span class="lineno">12230</span>&#160;{</div>
+<div class="line"><a name="l12231"></a><span class="lineno">12231</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;    {</div>
+<div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div>
+<div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160;        {</div>
+<div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;        }</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;    VMA_ASSERT(0);</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;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</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="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="l12245"></a><span class="lineno">12245</span>&#160;    {</div>
+<div class="line"><a name="l12246"></a><span class="lineno">12246</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div>
+<div class="line"><a name="l12247"></a><span class="lineno">12247</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="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">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="l12250"></a><span class="lineno">12250</span>&#160;            {</div>
+<div class="line"><a name="l12251"></a><span class="lineno">12251</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div>
+<div class="line"><a name="l12252"></a><span class="lineno">12252</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l12253"></a><span class="lineno">12253</span>&#160;            }</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;    }</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; </div>
+<div class="line"><a name="l12258"></a><span class="lineno">12258</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div>
+<div class="line"><a name="l12259"></a><span class="lineno">12259</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div>
+<div class="line"><a name="l12260"></a><span class="lineno">12260</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12261"></a><span class="lineno">12261</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l12262"></a><span class="lineno">12262</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l12263"></a><span class="lineno">12263</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
+<div class="line"><a name="l12264"></a><span class="lineno">12264</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l12265"></a><span class="lineno">12265</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l12267"></a><span class="lineno">12267</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l12268"></a><span class="lineno">12268</span>&#160;{</div>
+<div class="line"><a name="l12269"></a><span class="lineno">12269</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="l12270"></a><span class="lineno">12270</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="l12271"></a><span class="lineno">12271</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="l12272"></a><span class="lineno">12272</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="l12273"></a><span class="lineno">12273</span>&#160; </div>
+<div class="line"><a name="l12274"></a><span class="lineno">12274</span>&#160;    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12275"></a><span class="lineno">12275</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l12276"></a><span class="lineno">12276</span>&#160;        currentFrameIndex,</div>
+<div class="line"><a name="l12277"></a><span class="lineno">12277</span>&#160;        m_FrameInUseCount,</div>
+<div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160;        m_BufferImageGranularity,</div>
+<div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;        size,</div>
+<div class="line"><a name="l12280"></a><span class="lineno">12280</span>&#160;        alignment,</div>
+<div class="line"><a name="l12281"></a><span class="lineno">12281</span>&#160;        isUpperAddress,</div>
+<div class="line"><a name="l12282"></a><span class="lineno">12282</span>&#160;        suballocType,</div>
+<div class="line"><a name="l12283"></a><span class="lineno">12283</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l12284"></a><span class="lineno">12284</span>&#160;        strategy,</div>
+<div class="line"><a name="l12285"></a><span class="lineno">12285</span>&#160;        &amp;currRequest))</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;        <span class="comment">// Allocate from pCurrBlock.</span></div>
+<div class="line"><a name="l12288"></a><span class="lineno">12288</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</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>(mapped)</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;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l12293"></a><span class="lineno">12293</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160;            {</div>
+<div class="line"><a name="l12295"></a><span class="lineno">12295</span>&#160;                <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12296"></a><span class="lineno">12296</span>&#160;            }</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;            </div>
+<div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;        <span class="comment">// We no longer have an empty Allocation.</span></div>
+<div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</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;            m_HasEmptyBlock = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12303"></a><span class="lineno">12303</span>&#160;        }</div>
+<div class="line"><a name="l12304"></a><span class="lineno">12304</span>&#160;            </div>
+<div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;        *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160;        (*pAllocation)-&gt;Ctor(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div>
+<div class="line"><a name="l12309"></a><span class="lineno">12309</span>&#160;            pBlock,</div>
+<div class="line"><a name="l12310"></a><span class="lineno">12310</span>&#160;            currRequest.offset,</div>
+<div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;            alignment,</div>
+<div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;            size,</div>
+<div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;            suballocType,</div>
+<div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160;            mapped,</div>
+<div class="line"><a name="l12315"></a><span class="lineno">12315</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="l12316"></a><span class="lineno">12316</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l12317"></a><span class="lineno">12317</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div>
+<div class="line"><a name="l12318"></a><span class="lineno">12318</span>&#160;        m_hAllocator-&gt;m_Budget.m_AllocationBytes[m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex)] += size;</div>
+<div class="line"><a name="l12319"></a><span class="lineno">12319</span>&#160;        ++m_hAllocator-&gt;m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</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;            m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</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;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12325"></a><span class="lineno">12325</span>&#160;        {</div>
+<div class="line"><a name="l12326"></a><span class="lineno">12326</span>&#160;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div>
+<div class="line"><a name="l12327"></a><span class="lineno">12327</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="l12328"></a><span class="lineno">12328</span>&#160;        }</div>
+<div class="line"><a name="l12329"></a><span class="lineno">12329</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;    }</div>
+<div class="line"><a name="l12331"></a><span class="lineno">12331</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12332"></a><span class="lineno">12332</span>&#160;}</div>
+<div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160; </div>
+<div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div>
+<div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;{</div>
+<div class="line"><a name="l12336"></a><span class="lineno">12336</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l12337"></a><span class="lineno">12337</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l12338"></a><span class="lineno">12338</span>&#160;    allocInfo.allocationSize = blockSize;</div>
+<div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l12340"></a><span class="lineno">12340</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div>
+<div class="line"><a name="l12341"></a><span class="lineno">12341</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;    {</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;    <span class="comment">// New VkDeviceMemory successfully created.</span></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="comment">// Create new Allocation for it.</span></div>
+<div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div>
+<div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;    pBlock-&gt;Init(</div>
+<div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;        m_hAllocator,</div>
+<div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160;        m_hParentPool,</div>
+<div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;        m_MemoryTypeIndex,</div>
+<div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160;        mem,</div>
+<div class="line"><a name="l12355"></a><span class="lineno">12355</span>&#160;        allocInfo.allocationSize,</div>
+<div class="line"><a name="l12356"></a><span class="lineno">12356</span>&#160;        m_NextBlockId++,</div>
+<div class="line"><a name="l12357"></a><span class="lineno">12357</span>&#160;        m_Algorithm);</div>
+<div class="line"><a name="l12358"></a><span class="lineno">12358</span>&#160; </div>
+<div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;    m_Blocks.push_back(pBlock);</div>
+<div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</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;        *pNewBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;    }</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> VmaBlockVector::ApplyDefragmentationMovesCpu(</div>
+<div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l12370"></a><span class="lineno">12370</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves)</div>
+<div class="line"><a name="l12371"></a><span class="lineno">12371</span>&#160;{</div>
+<div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator-&gt;IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</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="keyword">enum</span> BLOCK_FLAG</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;        BLOCK_FLAG_USED = 0x00000001,</div>
+<div class="line"><a name="l12378"></a><span class="lineno">12378</span>&#160;        BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</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; </div>
+<div class="line"><a name="l12381"></a><span class="lineno">12381</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l12382"></a><span class="lineno">12382</span>&#160;    {</div>
+<div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;        uint32_t flags;</div>
+<div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160;        <span class="keywordtype">void</span>* pMappedData;</div>
+<div class="line"><a name="l12385"></a><span class="lineno">12385</span>&#160;    };</div>
+<div class="line"><a name="l12386"></a><span class="lineno">12386</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt;</div>
+<div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;        blockInfo(blockCount, BlockInfo(), VmaStlAllocator&lt;BlockInfo&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div>
+<div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;    memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</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;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l12391"></a><span class="lineno">12391</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l12392"></a><span class="lineno">12392</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</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;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;        blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;        blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</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;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</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;    <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div>
+<div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160;    {</div>
+<div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;        BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_USED) != 0)</div>
+<div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;        {</div>
+<div class="line"><a name="l12408"></a><span class="lineno">12408</span>&#160;            currBlockInfo.pMappedData = pBlock-&gt;GetMappedData();</div>
+<div class="line"><a name="l12409"></a><span class="lineno">12409</span>&#160;            <span class="comment">// It is not originally mapped - map it.</span></div>
+<div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;            <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</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;                pDefragCtx-&gt;res = pBlock-&gt;Map(m_hAllocator, 1, &amp;currBlockInfo.pMappedData);</div>
+<div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;                {</div>
+<div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;                    currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</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;            }</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; </div>
+<div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;    <span class="comment">// Go over all moves. Do actual data transfer.</span></div>
+<div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;    {</div>
+<div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator-&gt;m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l12425"></a><span class="lineno">12425</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</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;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12428"></a><span class="lineno">12428</span>&#160;        {</div>
+<div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</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;            <span class="keyword">const</span> BlockInfo&amp; srcBlockInfo = blockInfo[move.srcBlockIndex];</div>
+<div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; dstBlockInfo = blockInfo[move.dstBlockIndex];</div>
+<div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160; </div>
+<div class="line"><a name="l12434"></a><span class="lineno">12434</span>&#160;            VMA_ASSERT(srcBlockInfo.pMappedData &amp;&amp; dstBlockInfo.pMappedData);</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;            <span class="comment">// Invalidate source.</span></div>
+<div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div>
+<div class="line"><a name="l12438"></a><span class="lineno">12438</span>&#160;            {</div>
+<div class="line"><a name="l12439"></a><span class="lineno">12439</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div>
+<div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;                memRange.memory = pSrcBlock-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l12441"></a><span class="lineno">12441</span>&#160;                memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l12442"></a><span class="lineno">12442</span>&#160;                memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;                    VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l12444"></a><span class="lineno">12444</span>&#160;                    pSrcBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
+<div class="line"><a name="l12445"></a><span class="lineno">12445</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</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; </div>
+<div class="line"><a name="l12448"></a><span class="lineno">12448</span>&#160;            <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div>
+<div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;            memmove(</div>
+<div class="line"><a name="l12450"></a><span class="lineno">12450</span>&#160;                reinterpret_cast&lt;char*&gt;(dstBlockInfo.pMappedData) + move.dstOffset,</div>
+<div class="line"><a name="l12451"></a><span class="lineno">12451</span>&#160;                reinterpret_cast&lt;char*&gt;(srcBlockInfo.pMappedData) + move.srcOffset,</div>
+<div class="line"><a name="l12452"></a><span class="lineno">12452</span>&#160;                static_cast&lt;size_t&gt;(move.size));</div>
+<div class="line"><a name="l12453"></a><span class="lineno">12453</span>&#160; </div>
+<div class="line"><a name="l12454"></a><span class="lineno">12454</span>&#160;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</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;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div>
+<div class="line"><a name="l12458"></a><span class="lineno">12458</span>&#160;            }</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;            <span class="comment">// Flush destination.</span></div>
+<div class="line"><a name="l12461"></a><span class="lineno">12461</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</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;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div>
+<div class="line"><a name="l12464"></a><span class="lineno">12464</span>&#160;                memRange.memory = pDstBlock-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l12465"></a><span class="lineno">12465</span>&#160;                memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l12466"></a><span class="lineno">12466</span>&#160;                memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l12467"></a><span class="lineno">12467</span>&#160;                    VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l12468"></a><span class="lineno">12468</span>&#160;                    pDstBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
+<div class="line"><a name="l12469"></a><span class="lineno">12469</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</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; </div>
+<div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160;    <span class="comment">// Go over all blocks in reverse order. Unmap those that were mapped just for defragmentation.</span></div>
+<div class="line"><a name="l12475"></a><span class="lineno">12475</span>&#160;    <span class="comment">// Regardless of pCtx-&gt;res == VK_SUCCESS.</span></div>
+<div class="line"><a name="l12476"></a><span class="lineno">12476</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</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> BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div>
+<div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160;        {</div>
+<div class="line"><a name="l12481"></a><span class="lineno">12481</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12482"></a><span class="lineno">12482</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div>
+<div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;        }</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;}</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;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div>
+<div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;    VkCommandBuffer commandBuffer)</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="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160; </div>
+<div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;    pDefragCtx-&gt;blockContexts.resize(blockCount);</div>
+<div class="line"><a name="l12495"></a><span class="lineno">12495</span>&#160;    memset(pDefragCtx-&gt;blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div>
+<div class="line"><a name="l12496"></a><span class="lineno">12496</span>&#160; </div>
+<div class="line"><a name="l12497"></a><span class="lineno">12497</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l12498"></a><span class="lineno">12498</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;    {</div>
+<div class="line"><a name="l12501"></a><span class="lineno">12501</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l12502"></a><span class="lineno">12502</span>&#160;        pDefragCtx-&gt;blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160;        pDefragCtx-&gt;blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</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; </div>
+<div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div>
+<div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160; </div>
+<div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;    <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div>
+<div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160;    {</div>
+<div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;        VkBufferCreateInfo bufCreateInfo;</div>
+<div class="line"><a name="l12511"></a><span class="lineno">12511</span>&#160;        VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</div>
+<div class="line"><a name="l12512"></a><span class="lineno">12512</span>&#160; </div>
+<div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</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;            VmaBlockDefragmentationContext&amp; currBlockCtx = pDefragCtx-&gt;blockContexts[blockIndex];</div>
+<div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160;            <span class="keywordflow">if</span>((currBlockCtx.flags &amp; VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 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;                bufCreateInfo.size = pBlock-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;                pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l12521"></a><span class="lineno">12521</span>&#160;                    m_hAllocator-&gt;m_hDevice, &amp;bufCreateInfo, m_hAllocator-&gt;GetAllocationCallbacks(), &amp;currBlockCtx.hBuffer);</div>
+<div class="line"><a name="l12522"></a><span class="lineno">12522</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</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;                    pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory)(</div>
+<div class="line"><a name="l12525"></a><span class="lineno">12525</span>&#160;                        m_hAllocator-&gt;m_hDevice, currBlockCtx.hBuffer, pBlock-&gt;GetDeviceMemory(), 0);</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;            }</div>
+<div class="line"><a name="l12528"></a><span class="lineno">12528</span>&#160;        }</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; </div>
+<div class="line"><a name="l12531"></a><span class="lineno">12531</span>&#160;    <span class="comment">// Go over all moves. Post data transfer commands to command buffer.</span></div>
+<div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;    {</div>
+<div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12535"></a><span class="lineno">12535</span>&#160;        {</div>
+<div class="line"><a name="l12536"></a><span class="lineno">12536</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l12537"></a><span class="lineno">12537</span>&#160; </div>
+<div class="line"><a name="l12538"></a><span class="lineno">12538</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; srcBlockCtx = pDefragCtx-&gt;blockContexts[move.srcBlockIndex];</div>
+<div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; dstBlockCtx = pDefragCtx-&gt;blockContexts[move.dstBlockIndex];</div>
+<div class="line"><a name="l12540"></a><span class="lineno">12540</span>&#160; </div>
+<div class="line"><a name="l12541"></a><span class="lineno">12541</span>&#160;            VMA_ASSERT(srcBlockCtx.hBuffer &amp;&amp; dstBlockCtx.hBuffer);</div>
+<div class="line"><a name="l12542"></a><span class="lineno">12542</span>&#160; </div>
+<div class="line"><a name="l12543"></a><span class="lineno">12543</span>&#160;            VkBufferCopy region = {</div>
+<div class="line"><a name="l12544"></a><span class="lineno">12544</span>&#160;                move.srcOffset,</div>
+<div class="line"><a name="l12545"></a><span class="lineno">12545</span>&#160;                move.dstOffset,</div>
+<div class="line"><a name="l12546"></a><span class="lineno">12546</span>&#160;                move.size };</div>
+<div class="line"><a name="l12547"></a><span class="lineno">12547</span>&#160;            (*m_hAllocator-&gt;GetVulkanFunctions().vkCmdCopyBuffer)(</div>
+<div class="line"><a name="l12548"></a><span class="lineno">12548</span>&#160;                commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &amp;region);</div>
+<div class="line"><a name="l12549"></a><span class="lineno">12549</span>&#160;        }</div>
+<div class="line"><a name="l12550"></a><span class="lineno">12550</span>&#160;    }</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">// Save buffers to defrag context for later destruction.</span></div>
+<div class="line"><a name="l12553"></a><span class="lineno">12553</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; moveCount &gt; 0)</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;        pDefragCtx-&gt;res = VK_NOT_READY;</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; </div>
+<div class="line"><a name="l12559"></a><span class="lineno">12559</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
+<div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;{</div>
+<div class="line"><a name="l12561"></a><span class="lineno">12561</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12562"></a><span class="lineno">12562</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</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;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12565"></a><span class="lineno">12565</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</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">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</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="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div>
+<div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160;                {</div>
+<div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
+<div class="line"><a name="l12572"></a><span class="lineno">12572</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="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;                VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;                vma_delete(m_hAllocator, pBlock);</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;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;            {</div>
+<div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</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;        }</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;}</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12588"></a><span class="lineno">12588</span>&#160; </div>
+<div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div>
+<div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;{</div>
+<div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160; </div>
+<div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160; </div>
+<div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</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;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div>
+<div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</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;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div>
+<div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l12602"></a><span class="lineno">12602</span>&#160; </div>
+<div class="line"><a name="l12603"></a><span class="lineno">12603</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div>
+<div class="line"><a name="l12604"></a><span class="lineno">12604</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l12605"></a><span class="lineno">12605</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</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;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div>
+<div class="line"><a name="l12609"></a><span class="lineno">12609</span>&#160;        }</div>
+<div class="line"><a name="l12610"></a><span class="lineno">12610</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div>
+<div class="line"><a name="l12611"></a><span class="lineno">12611</span>&#160;        {</div>
+<div class="line"><a name="l12612"></a><span class="lineno">12612</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div>
+<div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;        }</div>
+<div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div>
+<div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div>
+<div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160; </div>
+<div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</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;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div>
+<div class="line"><a name="l12622"></a><span class="lineno">12622</span>&#160;            json.WriteNumber(m_FrameInUseCount);</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; </div>
+<div class="line"><a name="l12625"></a><span class="lineno">12625</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm != 0)</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;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div>
+<div class="line"><a name="l12628"></a><span class="lineno">12628</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</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="keywordflow">else</span></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;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div>
+<div class="line"><a name="l12634"></a><span class="lineno">12634</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l12635"></a><span class="lineno">12635</span>&#160;    }</div>
+<div class="line"><a name="l12636"></a><span class="lineno">12636</span>&#160; </div>
+<div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
+<div class="line"><a name="l12638"></a><span class="lineno">12638</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l12639"></a><span class="lineno">12639</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="l12640"></a><span class="lineno">12640</span>&#160;    {</div>
+<div class="line"><a name="l12641"></a><span class="lineno">12641</span>&#160;        json.BeginString();</div>
+<div class="line"><a name="l12642"></a><span class="lineno">12642</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div>
+<div class="line"><a name="l12643"></a><span class="lineno">12643</span>&#160;        json.EndString();</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;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</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;    json.EndObject();</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;    json.EndObject();</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="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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="keywordtype">void</span> VmaBlockVector::Defragment(</div>
+<div class="line"><a name="l12655"></a><span class="lineno">12655</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l12656"></a><span class="lineno">12656</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l12657"></a><span class="lineno">12657</span>&#160;    VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l12658"></a><span class="lineno">12658</span>&#160;    VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l12659"></a><span class="lineno">12659</span>&#160;    VkCommandBuffer commandBuffer)</div>
+<div class="line"><a name="l12660"></a><span class="lineno">12660</span>&#160;{</div>
+<div class="line"><a name="l12661"></a><span class="lineno">12661</span>&#160;    pCtx-&gt;res = VK_SUCCESS;</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="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div>
+<div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160;        m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</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="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove &gt; 0 &amp;&amp; maxCpuAllocationsToMove &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l12668"></a><span class="lineno">12668</span>&#160;        isHostVisible;</div>
+<div class="line"><a name="l12669"></a><span class="lineno">12669</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove &gt; 0 &amp;&amp; maxGpuAllocationsToMove &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l12670"></a><span class="lineno">12670</span>&#160;        !IsCorruptionDetectionEnabled() &amp;&amp;</div>
+<div class="line"><a name="l12671"></a><span class="lineno">12671</span>&#160;        ((1u &lt;&lt; m_MemoryTypeIndex) &amp; m_hAllocator-&gt;GetGpuDefragmentationMemoryTypeBits()) != 0;</div>
+<div class="line"><a name="l12672"></a><span class="lineno">12672</span>&#160; </div>
+<div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;    <span class="comment">// There are options to defragment this memory type.</span></div>
+<div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;    <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</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="keywordtype">bool</span> defragmentOnGpu;</div>
+<div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;        <span class="comment">// There is only one option to defragment this memory type.</span></div>
+<div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;        <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</div>
+<div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;        {</div>
+<div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;            defragmentOnGpu = canDefragmentOnGpu;</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;        <span class="comment">// Both options are available: Heuristics to choose the best one.</span></div>
+<div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;        {</div>
+<div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160;            defragmentOnGpu = (memPropFlags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div>
+<div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;                m_hAllocator-&gt;IsIntegratedGpu();</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; </div>
+<div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div>
+<div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160; </div>
+<div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;        <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div>
+<div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;        {</div>
+<div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;            m_Mutex.LockWrite();</div>
+<div class="line"><a name="l12694"></a><span class="lineno">12694</span>&#160;            pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12695"></a><span class="lineno">12695</span>&#160;        }</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;        pCtx-&gt;Begin(overlappingMoveSupported);</div>
+<div class="line"><a name="l12698"></a><span class="lineno">12698</span>&#160; </div>
+<div class="line"><a name="l12699"></a><span class="lineno">12699</span>&#160;        <span class="comment">// Defragment.</span></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;        <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div>
+<div class="line"><a name="l12702"></a><span class="lineno">12702</span>&#160;        <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div>
+<div class="line"><a name="l12703"></a><span class="lineno">12703</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt; moves = </div>
+<div class="line"><a name="l12704"></a><span class="lineno">12704</span>&#160;            VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;(VmaStlAllocator&lt;VmaDefragmentationMove&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div>
+<div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;        pCtx-&gt;res = pCtx-&gt;GetAlgorithm()-&gt;Defragment(moves, maxBytesToMove, maxAllocationsToMove);</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;        <span class="comment">// Accumulate statistics.</span></div>
+<div class="line"><a name="l12708"></a><span class="lineno">12708</span>&#160;        <span class="keywordflow">if</span>(pStats != VMA_NULL)</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="keyword">const</span> VkDeviceSize bytesMoved = pCtx-&gt;GetAlgorithm()-&gt;GetBytesMoved();</div>
+<div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;            <span class="keyword">const</span> uint32_t allocationsMoved = pCtx-&gt;GetAlgorithm()-&gt;GetAllocationsMoved();</div>
+<div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div>
+<div class="line"><a name="l12713"></a><span class="lineno">12713</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div>
+<div class="line"><a name="l12714"></a><span class="lineno">12714</span>&#160;            VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div>
+<div class="line"><a name="l12715"></a><span class="lineno">12715</span>&#160;            VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div>
+<div class="line"><a name="l12716"></a><span class="lineno">12716</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</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;                maxGpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l12719"></a><span class="lineno">12719</span>&#160;                maxGpuAllocationsToMove -= allocationsMoved;</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;            <span class="keywordflow">else</span></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;                maxCpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;                maxCpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;            }</div>
+<div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;        }</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="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</div>
+<div class="line"><a name="l12729"></a><span class="lineno">12729</span>&#160;        {</div>
+<div class="line"><a name="l12730"></a><span class="lineno">12730</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</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;                ApplyDefragmentationMovesGpu(pCtx, moves, commandBuffer);</div>
+<div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;            }</div>
+<div class="line"><a name="l12734"></a><span class="lineno">12734</span>&#160;            <span class="keywordflow">else</span></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;                ApplyDefragmentationMovesCpu(pCtx, moves);</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;        }</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="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div>
+<div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l12744"></a><span class="lineno">12744</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</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;    <span class="comment">// Destroy buffers.</span></div>
+<div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx-&gt;blockContexts.size(); blockIndex--; )</div>
+<div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;    {</div>
+<div class="line"><a name="l12749"></a><span class="lineno">12749</span>&#160;        VmaBlockDefragmentationContext&amp; blockCtx = pCtx-&gt;blockContexts[blockIndex];</div>
+<div class="line"><a name="l12750"></a><span class="lineno">12750</span>&#160;        <span class="keywordflow">if</span>(blockCtx.hBuffer)</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;            (*m_hAllocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(</div>
+<div class="line"><a name="l12753"></a><span class="lineno">12753</span>&#160;                m_hAllocator-&gt;m_hDevice, blockCtx.hBuffer, m_hAllocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l12754"></a><span class="lineno">12754</span>&#160;        }</div>
+<div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160;    }</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;    <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</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;        FreeEmptyBlocks(pStats);</div>
+<div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;    }</div>
+<div class="line"><a name="l12761"></a><span class="lineno">12761</span>&#160; </div>
+<div class="line"><a name="l12762"></a><span class="lineno">12762</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked)</div>
+<div class="line"><a name="l12763"></a><span class="lineno">12763</span>&#160;    {</div>
+<div class="line"><a name="l12764"></a><span class="lineno">12764</span>&#160;        VMA_ASSERT(m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12765"></a><span class="lineno">12765</span>&#160;        m_Mutex.UnlockWrite();</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="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12771"></a><span class="lineno">12771</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l12772"></a><span class="lineno">12772</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="l12773"></a><span class="lineno">12773</span>&#160;    {</div>
+<div class="line"><a name="l12774"></a><span class="lineno">12774</span>&#160;        result += m_Blocks[i]-&gt;m_pMetadata-&gt;GetAllocationCount();</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">return</span> result;</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">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12780"></a><span class="lineno">12780</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12781"></a><span class="lineno">12781</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</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="keywordflow">return</span> <span class="keyword">false</span>;</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;    VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l12786"></a><span class="lineno">12786</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l12787"></a><span class="lineno">12787</span>&#160;    {</div>
+<div class="line"><a name="l12788"></a><span class="lineno">12788</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div>
+<div class="line"><a name="l12789"></a><span class="lineno">12789</span>&#160;        VMA_ASSERT(m_Algorithm == 0);</div>
+<div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</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;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12794"></a><span class="lineno">12794</span>&#160;        }</div>
+<div class="line"><a name="l12795"></a><span class="lineno">12795</span>&#160;    }</div>
+<div class="line"><a name="l12796"></a><span class="lineno">12796</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12797"></a><span class="lineno">12797</span>&#160;}</div>
+<div class="line"><a name="l12798"></a><span class="lineno">12798</span>&#160; </div>
+<div class="line"><a name="l12799"></a><span class="lineno">12799</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l12800"></a><span class="lineno">12800</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12801"></a><span class="lineno">12801</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</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;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12804"></a><span class="lineno">12804</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div>
+<div class="line"><a name="l12805"></a><span class="lineno">12805</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</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;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12808"></a><span class="lineno">12808</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12809"></a><span class="lineno">12809</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</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">if</span>(pLostAllocationCount != VMA_NULL)</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;        *pLostAllocationCount = lostAllocationCount;</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;}</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;VkResult VmaBlockVector::CheckCorruption()</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;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;    {</div>
+<div class="line"><a name="l12821"></a><span class="lineno">12821</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</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; </div>
+<div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</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;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div>
+<div class="line"><a name="l12830"></a><span class="lineno">12830</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</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">return</span> res;</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;    }</div>
+<div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</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="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l12842"></a><span class="lineno">12842</span>&#160; </div>
+<div class="line"><a name="l12843"></a><span class="lineno">12843</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</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;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12846"></a><span class="lineno">12846</span>&#160;    {</div>
+<div class="line"><a name="l12847"></a><span class="lineno">12847</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12848"></a><span class="lineno">12848</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12849"></a><span class="lineno">12849</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l12850"></a><span class="lineno">12850</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l12851"></a><span class="lineno">12851</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div>
+<div class="line"><a name="l12852"></a><span class="lineno">12852</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l12853"></a><span class="lineno">12853</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l12854"></a><span class="lineno">12854</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</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;}</div>
+<div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160; </div>
+<div class="line"><a name="l12859"></a><span class="lineno">12859</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></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;VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div>
+<div class="line"><a name="l12862"></a><span class="lineno">12862</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12863"></a><span class="lineno">12863</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l12864"></a><span class="lineno">12864</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;    m_AllAllocations(false),</div>
+<div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;    m_BytesMoved(0),</div>
+<div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;    m_AllocationsMoved(0),</div>
+<div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;{</div>
+<div class="line"><a name="l12873"></a><span class="lineno">12873</span>&#160;    <span class="comment">// Create block info for each block.</span></div>
+<div class="line"><a name="l12874"></a><span class="lineno">12874</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="l12875"></a><span class="lineno">12875</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="l12876"></a><span class="lineno">12876</span>&#160;    {</div>
+<div class="line"><a name="l12877"></a><span class="lineno">12877</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;        pBlockInfo-&gt;m_OriginalBlockIndex = blockIndex;</div>
+<div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12880"></a><span class="lineno">12880</span>&#160;        m_Blocks.push_back(pBlockInfo);</div>
+<div class="line"><a name="l12881"></a><span class="lineno">12881</span>&#160;    }</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;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div>
+<div class="line"><a name="l12884"></a><span class="lineno">12884</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</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;VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</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">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</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;        vma_delete(m_hAllocator, m_Blocks[i]);</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;}</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;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Generic::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</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="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="l12898"></a><span class="lineno">12898</span>&#160;    <span class="keywordflow">if</span>(hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l12899"></a><span class="lineno">12899</span>&#160;    {</div>
+<div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAlloc-&gt;GetBlock();</div>
+<div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;        BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div>
+<div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160;        <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</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;            AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div>
+<div class="line"><a name="l12905"></a><span class="lineno">12905</span>&#160;            (*it)-&gt;m_Allocations.push_back(allocInfo);</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;        <span class="keywordflow">else</span></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;            VMA_ASSERT(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; </div>
+<div class="line"><a name="l12912"></a><span class="lineno">12912</span>&#160;        ++m_AllocationCount;</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;}</div>
+<div class="line"><a name="l12915"></a><span class="lineno">12915</span>&#160; </div>
+<div class="line"><a name="l12916"></a><span class="lineno">12916</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div>
+<div class="line"><a name="l12917"></a><span class="lineno">12917</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l12918"></a><span class="lineno">12918</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l12919"></a><span class="lineno">12919</span>&#160;    uint32_t maxAllocationsToMove)</div>
+<div class="line"><a name="l12920"></a><span class="lineno">12920</span>&#160;{</div>
+<div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div>
+<div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;    {</div>
+<div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160;        <span class="keywordflow">return</span> 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; </div>
+<div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;    <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;    <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;    uint32_t strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a>;</div>
+<div class="line"><a name="l12929"></a><span class="lineno">12929</span>&#160;    <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l12930"></a><span class="lineno">12930</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div>
+<div class="line"><a name="l12931"></a><span class="lineno">12931</span>&#160;    <span class="comment">// Option 3:</span></div>
+<div class="line"><a name="l12932"></a><span class="lineno">12932</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div>
+<div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160; </div>
+<div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;    <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div>
+<div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160;    <span class="comment">// When FAST_ALGORITHM, move allocations from only last out of blocks that contain non-movable allocations.</span></div>
+<div class="line"><a name="l12936"></a><span class="lineno">12936</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l12937"></a><span class="lineno">12937</span>&#160;<span class="comment">    if(m_AlgorithmFlags &amp; VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div>
+<div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;<span class="comment">    {</span></div>
+<div class="line"><a name="l12939"></a><span class="lineno">12939</span>&#160;<span class="comment">        const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div>
+<div class="line"><a name="l12940"></a><span class="lineno">12940</span>&#160;<span class="comment">        if(blocksWithNonMovableCount &gt; 0)</span></div>
+<div class="line"><a name="l12941"></a><span class="lineno">12941</span>&#160;<span class="comment">        {</span></div>
+<div class="line"><a name="l12942"></a><span class="lineno">12942</span>&#160;<span class="comment">            srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div>
+<div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160;<span class="comment">        }</span></div>
+<div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;<span class="comment">    }</span></div>
+<div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;<span class="comment">    */</span></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;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l12949"></a><span class="lineno">12949</span>&#160;    <span class="keywordflow">for</span>(;;)</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="comment">// 1. Find next allocation to move.</span></div>
+<div class="line"><a name="l12952"></a><span class="lineno">12952</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="l12953"></a><span class="lineno">12953</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div>
+<div class="line"><a name="l12954"></a><span class="lineno">12954</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</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;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div>
+<div class="line"><a name="l12957"></a><span class="lineno">12957</span>&#160;            {</div>
+<div class="line"><a name="l12958"></a><span class="lineno">12958</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div>
+<div class="line"><a name="l12959"></a><span class="lineno">12959</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</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;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12962"></a><span class="lineno">12962</span>&#160;                }</div>
+<div class="line"><a name="l12963"></a><span class="lineno">12963</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;                {</div>
+<div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;                    --srcBlockIndex;</div>
+<div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;                    srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;                }</div>
+<div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160;            }</div>
+<div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;            <span class="keywordflow">else</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;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</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;        }</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;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div>
+<div class="line"><a name="l12976"></a><span class="lineno">12976</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</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;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l12979"></a><span class="lineno">12979</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div>
+<div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</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="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div>
+<div class="line"><a name="l12984"></a><span class="lineno">12984</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="l12985"></a><span class="lineno">12985</span>&#160;        {</div>
+<div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div>
+<div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;            VmaAllocationRequest dstAllocRequest;</div>
+<div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;                m_CurrentFrameIndex,</div>
+<div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div>
+<div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div>
+<div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160;                size,</div>
+<div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;                alignment,</div>
+<div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div>
+<div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;                suballocType,</div>
+<div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;                strategy,</div>
+<div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div>
+<div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;            MoveMakesSense(</div>
+<div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</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;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</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;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div>
+<div class="line"><a name="l13005"></a><span class="lineno">13005</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div>
+<div class="line"><a name="l13006"></a><span class="lineno">13006</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</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="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;                VmaDefragmentationMove move;</div>
+<div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160;                move.srcBlockIndex = pSrcBlockInfo-&gt;m_OriginalBlockIndex;</div>
+<div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;                move.dstBlockIndex = pDstBlockInfo-&gt;m_OriginalBlockIndex;</div>
+<div class="line"><a name="l13014"></a><span class="lineno">13014</span>&#160;                move.srcOffset = srcOffset;</div>
+<div class="line"><a name="l13015"></a><span class="lineno">13015</span>&#160;                move.dstOffset = dstAllocRequest.offset;</div>
+<div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;                move.size = size;</div>
+<div class="line"><a name="l13017"></a><span class="lineno">13017</span>&#160;                moves.push_back(move);</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;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div>
+<div class="line"><a name="l13020"></a><span class="lineno">13020</span>&#160;                    dstAllocRequest,</div>
+<div class="line"><a name="l13021"></a><span class="lineno">13021</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l13022"></a><span class="lineno">13022</span>&#160;                    size,</div>
+<div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;                    allocInfo.m_hAllocation);</div>
+<div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</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;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</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;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div>
+<div class="line"><a name="l13029"></a><span class="lineno">13029</span>&#160;                {</div>
+<div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</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; </div>
+<div class="line"><a name="l13033"></a><span class="lineno">13033</span>&#160;                ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160;                m_BytesMoved += size;</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;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div>
+<div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160; </div>
+<div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;                <span class="keywordflow">break</span>;</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; </div>
+<div class="line"><a name="l13042"></a><span class="lineno">13042</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="l13043"></a><span class="lineno">13043</span>&#160; </div>
+<div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div>
+<div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;        {</div>
+<div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;            --srcAllocIndex;</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;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</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;                --srcBlockIndex;</div>
+<div class="line"><a name="l13053"></a><span class="lineno">13053</span>&#160;                srcAllocIndex = SIZE_MAX;</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;            <span class="keywordflow">else</span></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;                <span class="keywordflow">return</span> VK_SUCCESS;</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;    }</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">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l13064"></a><span class="lineno">13064</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l13065"></a><span class="lineno">13065</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l13066"></a><span class="lineno">13066</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="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_Blocks[i]-&gt;m_HasNonMovableAllocations)</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;            ++result;</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="keywordflow">return</span> result;</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; </div>
+<div class="line"><a name="l13076"></a><span class="lineno">13076</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div>
+<div class="line"><a name="l13077"></a><span class="lineno">13077</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;    uint32_t maxAllocationsToMove)</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;    <span class="keywordflow">if</span>(!m_AllAllocations &amp;&amp; m_AllocationCount == 0)</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;        <span class="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l13086"></a><span class="lineno">13086</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l13087"></a><span class="lineno">13087</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="l13088"></a><span class="lineno">13088</span>&#160;    {</div>
+<div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</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="keywordflow">if</span>(m_AllAllocations)</div>
+<div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;        {</div>
+<div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;            VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo-&gt;m_pBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
+<div class="line"><a name="l13096"></a><span class="lineno">13096</span>&#160;                ++it)</div>
+<div class="line"><a name="l13097"></a><span class="lineno">13097</span>&#160;            {</div>
+<div class="line"><a name="l13098"></a><span class="lineno">13098</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l13099"></a><span class="lineno">13099</span>&#160;                {</div>
+<div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;                    AllocationInfo allocInfo = AllocationInfo(it-&gt;hAllocation, VMA_NULL);</div>
+<div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;                    pBlockInfo-&gt;m_Allocations.push_back(allocInfo);</div>
+<div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;                }</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;        }</div>
+<div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160; </div>
+<div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div>
+<div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;        </div>
+<div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;        <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160;        <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160;        pBlockInfo-&gt;SortAllocationsByOffsetDescending();</div>
+<div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;        <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l13112"></a><span class="lineno">13112</span>&#160;        <span class="comment">//pBlockInfo-&gt;SortAllocationsBySizeDescending();</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; </div>
+<div class="line"><a name="l13115"></a><span class="lineno">13115</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="l13116"></a><span class="lineno">13116</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</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;    <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;    <span class="keyword">const</span> uint32_t roundCount = 2;</div>
+<div class="line"><a name="l13120"></a><span class="lineno">13120</span>&#160; </div>
+<div class="line"><a name="l13121"></a><span class="lineno">13121</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div>
+<div class="line"><a name="l13122"></a><span class="lineno">13122</span>&#160;    VkResult result = VK_SUCCESS;</div>
+<div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;    <span class="keywordflow">for</span>(uint32_t round = 0; (round &lt; roundCount) &amp;&amp; (result == VK_SUCCESS); ++round)</div>
+<div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;    {</div>
+<div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;        result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove);</div>
+<div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;    }</div>
+<div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160; </div>
+<div class="line"><a name="l13128"></a><span class="lineno">13128</span>&#160;    <span class="keywordflow">return</span> result;</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;<span class="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div>
+<div class="line"><a name="l13132"></a><span class="lineno">13132</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
+<div class="line"><a name="l13133"></a><span class="lineno">13133</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div>
+<div class="line"><a name="l13134"></a><span class="lineno">13134</span>&#160;{</div>
+<div class="line"><a name="l13135"></a><span class="lineno">13135</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</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="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div>
+<div class="line"><a name="l13140"></a><span class="lineno">13140</span>&#160;    {</div>
+<div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</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="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;}</div>
+<div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160; </div>
+<div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Fast</span></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;VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div>
+<div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l13156"></a><span class="lineno">13156</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l13157"></a><span class="lineno">13157</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l13158"></a><span class="lineno">13158</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l13159"></a><span class="lineno">13159</span>&#160;    m_OverlappingMoveSupported(overlappingMoveSupported),</div>
+<div class="line"><a name="l13160"></a><span class="lineno">13160</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l13161"></a><span class="lineno">13161</span>&#160;    m_AllAllocations(false),</div>
+<div class="line"><a name="l13162"></a><span class="lineno">13162</span>&#160;    m_BytesMoved(0),</div>
+<div class="line"><a name="l13163"></a><span class="lineno">13163</span>&#160;    m_AllocationsMoved(0),</div>
+<div class="line"><a name="l13164"></a><span class="lineno">13164</span>&#160;    m_BlockInfos(VmaStlAllocator&lt;BlockInfo&gt;(hAllocator-&gt;GetAllocationCallbacks()))</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;    VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</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; </div>
+<div class="line"><a name="l13170"></a><span class="lineno">13170</span>&#160;VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</div>
+<div class="line"><a name="l13171"></a><span class="lineno">13171</span>&#160;{</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;VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div>
+<div class="line"><a name="l13175"></a><span class="lineno">13175</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l13176"></a><span class="lineno">13176</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;    uint32_t maxAllocationsToMove)</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;    VMA_ASSERT(m_AllAllocations || m_pBlockVector-&gt;CalcAllocationCount() == m_AllocationCount);</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="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l13182"></a><span class="lineno">13182</span>&#160;    <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</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;        <span class="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;    PreprocessMetadata();</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="comment">// Sort blocks in order from most destination.</span></div>
+<div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160; </div>
+<div class="line"><a name="l13191"></a><span class="lineno">13191</span>&#160;    m_BlockInfos.resize(blockCount);</div>
+<div class="line"><a name="l13192"></a><span class="lineno">13192</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; blockCount; ++i)</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;        m_BlockInfos[i].origBlockIndex = i;</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; </div>
+<div class="line"><a name="l13197"></a><span class="lineno">13197</span>&#160;    VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo&amp; lhs, <span class="keyword">const</span> BlockInfo&amp; rhs) -&gt; <span class="keywordtype">bool</span> {</div>
+<div class="line"><a name="l13198"></a><span class="lineno">13198</span>&#160;        <span class="keywordflow">return</span> m_pBlockVector-&gt;GetBlock(lhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt;</div>
+<div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;            m_pBlockVector-&gt;GetBlock(rhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize();</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; </div>
+<div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160;    <span class="comment">// THE MAIN ALGORITHM</span></div>
+<div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160; </div>
+<div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160;    FreeSpaceDatabase freeSpaceDb;</div>
+<div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160; </div>
+<div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;    <span class="keywordtype">size_t</span> dstBlockInfoIndex = 0;</div>
+<div class="line"><a name="l13207"></a><span class="lineno">13207</span>&#160;    <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13208"></a><span class="lineno">13208</span>&#160;    VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;    VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;    VkDeviceSize dstBlockSize = pDstMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;    VkDeviceSize dstOffset = 0;</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="keywordtype">bool</span> end = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13214"></a><span class="lineno">13214</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end &amp;&amp; srcBlockInfoIndex &lt; blockCount; ++srcBlockInfoIndex)</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="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector-&gt;GetBlock(srcOrigBlockIndex);</div>
+<div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l13220"></a><span class="lineno">13220</span>&#160;            !end &amp;&amp; srcSuballocIt != pSrcMetadata-&gt;m_Suballocations.end(); )</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;            VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt-&gt;hAllocation;</div>
+<div class="line"><a name="l13223"></a><span class="lineno">13223</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc-&gt;GetAlignment();</div>
+<div class="line"><a name="l13224"></a><span class="lineno">13224</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt-&gt;size;</div>
+<div class="line"><a name="l13225"></a><span class="lineno">13225</span>&#160;            <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div>
+<div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;                m_BytesMoved + srcAllocSize &gt; maxBytesToMove)</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;                end = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;            }</div>
+<div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt-&gt;offset;</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="comment">// Try to place it in one of free spaces from the database.</span></div>
+<div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;            <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div>
+<div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160;            VkDeviceSize dstAllocOffset;</div>
+<div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;            <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div>
+<div class="line"><a name="l13237"></a><span class="lineno">13237</span>&#160;                freeSpaceInfoIndex, dstAllocOffset))</div>
+<div class="line"><a name="l13238"></a><span class="lineno">13238</span>&#160;            {</div>
+<div class="line"><a name="l13239"></a><span class="lineno">13239</span>&#160;                <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13240"></a><span class="lineno">13240</span>&#160;                VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector-&gt;GetBlock(freeSpaceOrigBlockIndex);</div>
+<div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160;                VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13242"></a><span class="lineno">13242</span>&#160; </div>
+<div class="line"><a name="l13243"></a><span class="lineno">13243</span>&#160;                <span class="comment">// Same block</span></div>
+<div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;                <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;                {</div>
+<div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
+<div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160; </div>
+<div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
+<div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160; </div>
+<div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;                    suballoc.hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;                    ++m_AllocationsMoved;</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;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13257"></a><span class="lineno">13257</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l13258"></a><span class="lineno">13258</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;                    srcSuballocIt = nextSuballocIt;</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;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</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;                    VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13264"></a><span class="lineno">13264</span>&#160;                        srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
+<div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;                        srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13266"></a><span class="lineno">13266</span>&#160;                        srcAllocSize };</div>
+<div class="line"><a name="l13267"></a><span class="lineno">13267</span>&#160;                    moves.push_back(move);</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;                <span class="comment">// Different block</span></div>
+<div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;                <span class="keywordflow">else</span></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">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160; </div>
+<div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;                    VMA_ASSERT(freeSpaceInfoIndex &lt; srcBlockInfoIndex);</div>
+<div class="line"><a name="l13275"></a><span class="lineno">13275</span>&#160; </div>
+<div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div>
+<div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;                    ++m_AllocationsMoved;</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;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13283"></a><span class="lineno">13283</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l13284"></a><span class="lineno">13284</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160;                    srcSuballocIt = nextSuballocIt;</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;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</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;                    VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;                        srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
+<div class="line"><a name="l13291"></a><span class="lineno">13291</span>&#160;                        srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13292"></a><span class="lineno">13292</span>&#160;                        srcAllocSize };</div>
+<div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;                    moves.push_back(move);</div>
+<div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160;                }</div>
+<div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;            }</div>
+<div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;            {</div>
+<div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;                dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</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="comment">// If the allocation doesn&#39;t fit before the end of dstBlock, forward to next block.</span></div>
+<div class="line"><a name="l13301"></a><span class="lineno">13301</span>&#160;                <span class="keywordflow">while</span>(dstBlockInfoIndex &lt; srcBlockInfoIndex &amp;&amp;</div>
+<div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;                    dstAllocOffset + srcAllocSize &gt; dstBlockSize)</div>
+<div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;                {</div>
+<div class="line"><a name="l13304"></a><span class="lineno">13304</span>&#160;                    <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div>
+<div class="line"><a name="l13305"></a><span class="lineno">13305</span>&#160;                    freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</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;                    ++dstBlockInfoIndex;</div>
+<div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;                    dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;                    pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;                    pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;                    dstBlockSize = pDstMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;                    dstOffset = 0;</div>
+<div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;                    dstAllocOffset = 0;</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; </div>
+<div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;                <span class="comment">// Same block</span></div>
+<div class="line"><a name="l13317"></a><span class="lineno">13317</span>&#160;                <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l13318"></a><span class="lineno">13318</span>&#160;                {</div>
+<div class="line"><a name="l13319"></a><span class="lineno">13319</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
+<div class="line"><a name="l13320"></a><span class="lineno">13320</span>&#160; </div>
+<div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;                    <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize &gt; srcAllocOffset;</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="keywordtype">bool</span> skipOver = overlap;</div>
+<div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160;                    <span class="keywordflow">if</span>(overlap &amp;&amp; m_OverlappingMoveSupported &amp;&amp; dstAllocOffset &lt; srcAllocOffset)</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;                        <span class="comment">// If destination and source place overlap, skip if it would move it</span></div>
+<div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160;                        <span class="comment">// by only &lt; 1/64 of its size.</span></div>
+<div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;                        skipOver = (srcAllocOffset - dstAllocOffset) * 64 &lt; srcAllocSize;</div>
+<div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160;                    }</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;                    <span class="keywordflow">if</span>(skipOver)</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;                        freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</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;                        dstOffset = srcAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13336"></a><span class="lineno">13336</span>&#160;                        ++srcSuballocIt;</div>
+<div class="line"><a name="l13337"></a><span class="lineno">13337</span>&#160;                    }</div>
+<div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
+<div class="line"><a name="l13339"></a><span class="lineno">13339</span>&#160;                    <span class="keywordflow">else</span></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;                        srcSuballocIt-&gt;offset = dstAllocOffset;</div>
+<div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;                        srcSuballocIt-&gt;hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;                        dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;                        m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160;                        ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;                        ++srcSuballocIt;</div>
+<div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;                        VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;                            srcOrigBlockIndex, dstOrigBlockIndex,</div>
+<div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;                            srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;                            srcAllocSize };</div>
+<div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160;                        moves.push_back(move);</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;                }</div>
+<div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;                <span class="comment">// Different block</span></div>
+<div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;                <span class="keywordflow">else</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;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160; </div>
+<div class="line"><a name="l13359"></a><span class="lineno">13359</span>&#160;                    VMA_ASSERT(dstBlockInfoIndex &lt; srcBlockInfoIndex);</div>
+<div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160;                    VMA_ASSERT(dstAllocOffset + srcAllocSize &lt;= dstBlockSize);</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;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13363"></a><span class="lineno">13363</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13364"></a><span class="lineno">13364</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div>
+<div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;                    dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13366"></a><span class="lineno">13366</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13367"></a><span class="lineno">13367</span>&#160;                    ++m_AllocationsMoved;</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;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13370"></a><span class="lineno">13370</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l13371"></a><span class="lineno">13371</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13372"></a><span class="lineno">13372</span>&#160;                    srcSuballocIt = nextSuballocIt;</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;                    pDstMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l13375"></a><span class="lineno">13375</span>&#160; </div>
+<div class="line"><a name="l13376"></a><span class="lineno">13376</span>&#160;                    VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13377"></a><span class="lineno">13377</span>&#160;                        srcOrigBlockIndex, dstOrigBlockIndex,</div>
+<div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;                        srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;                        srcAllocSize };</div>
+<div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;                    moves.push_back(move);</div>
+<div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;                }</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;        }</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; </div>
+<div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;    m_BlockInfos.clear();</div>
+<div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160;    </div>
+<div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;    PostprocessMetadata();</div>
+<div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160; </div>
+<div class="line"><a name="l13390"></a><span class="lineno">13390</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13391"></a><span class="lineno">13391</span>&#160;}</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;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l13396"></a><span class="lineno">13396</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="l13397"></a><span class="lineno">13397</span>&#160;    {</div>
+<div class="line"><a name="l13398"></a><span class="lineno">13398</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;        pMetadata-&gt;m_FreeCount = 0;</div>
+<div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;        pMetadata-&gt;m_SumFreeSize = pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13402"></a><span class="lineno">13402</span>&#160;        pMetadata-&gt;m_FreeSuballocationsBySize.clear();</div>
+<div class="line"><a name="l13403"></a><span class="lineno">13403</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l13404"></a><span class="lineno">13404</span>&#160;            it != pMetadata-&gt;m_Suballocations.end(); )</div>
+<div class="line"><a name="l13405"></a><span class="lineno">13405</span>&#160;        {</div>
+<div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;            <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;                VmaSuballocationList::iterator nextIt = it;</div>
+<div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;                ++nextIt;</div>
+<div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160;                pMetadata-&gt;m_Suballocations.erase(it);</div>
+<div class="line"><a name="l13411"></a><span class="lineno">13411</span>&#160;                it = nextIt;</div>
+<div class="line"><a name="l13412"></a><span class="lineno">13412</span>&#160;            }</div>
+<div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;            {</div>
+<div class="line"><a name="l13415"></a><span class="lineno">13415</span>&#160;                ++it;</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;}</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> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</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="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l13424"></a><span class="lineno">13424</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="l13425"></a><span class="lineno">13425</span>&#160;    {</div>
+<div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
+<div class="line"><a name="l13428"></a><span class="lineno">13428</span>&#160;        <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata-&gt;GetSize();</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="comment">// No allocations in this block - entire area is free.</span></div>
+<div class="line"><a name="l13431"></a><span class="lineno">13431</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;m_Suballocations.empty())</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;            pMetadata-&gt;m_FreeCount = 1;</div>
+<div class="line"><a name="l13434"></a><span class="lineno">13434</span>&#160;            <span class="comment">//pMetadata-&gt;m_SumFreeSize is already set to blockSize.</span></div>
+<div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;            VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;                0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;                blockSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13438"></a><span class="lineno">13438</span>&#160;                VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13439"></a><span class="lineno">13439</span>&#160;                VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13440"></a><span class="lineno">13440</span>&#160;            pMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l13441"></a><span class="lineno">13441</span>&#160;            pMetadata-&gt;RegisterFreeSuballocation(pMetadata-&gt;m_Suballocations.begin());</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;        <span class="comment">// There are some allocations in this block.</span></div>
+<div class="line"><a name="l13444"></a><span class="lineno">13444</span>&#160;        <span class="keywordflow">else</span></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;            VkDeviceSize offset = 0;</div>
+<div class="line"><a name="l13447"></a><span class="lineno">13447</span>&#160;            VmaSuballocationList::iterator it;</div>
+<div class="line"><a name="l13448"></a><span class="lineno">13448</span>&#160;            <span class="keywordflow">for</span>(it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l13449"></a><span class="lineno">13449</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
+<div class="line"><a name="l13450"></a><span class="lineno">13450</span>&#160;                ++it)</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(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l13453"></a><span class="lineno">13453</span>&#160;                VMA_ASSERT(it-&gt;offset &gt;= offset);</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="comment">// Need to insert preceding free space.</span></div>
+<div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160;                <span class="keywordflow">if</span>(it-&gt;offset &gt; offset)</div>
+<div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;                {</div>
+<div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160;                    ++pMetadata-&gt;m_FreeCount;</div>
+<div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160;                    <span class="keyword">const</span> VkDeviceSize freeSize = it-&gt;offset - offset;</div>
+<div class="line"><a name="l13460"></a><span class="lineno">13460</span>&#160;                    VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13461"></a><span class="lineno">13461</span>&#160;                        offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;                        freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;                        VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;                        VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13465"></a><span class="lineno">13465</span>&#160;                    VmaSuballocationList::iterator precedingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13466"></a><span class="lineno">13466</span>&#160;                    <span class="keywordflow">if</span>(freeSize &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                        pMetadata-&gt;m_FreeSuballocationsBySize.push_back(precedingFreeIt);</div>
+<div class="line"><a name="l13469"></a><span class="lineno">13469</span>&#160;                    }</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; </div>
+<div class="line"><a name="l13472"></a><span class="lineno">13472</span>&#160;                pMetadata-&gt;m_SumFreeSize -= it-&gt;size;</div>
+<div class="line"><a name="l13473"></a><span class="lineno">13473</span>&#160;                offset = it-&gt;offset + it-&gt;size;</div>
+<div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160;            }</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;            <span class="comment">// Need to insert trailing free space.</span></div>
+<div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;            <span class="keywordflow">if</span>(offset &lt; blockSize)</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;                ++pMetadata-&gt;m_FreeCount;</div>
+<div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160;                <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div>
+<div class="line"><a name="l13481"></a><span class="lineno">13481</span>&#160;                VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13482"></a><span class="lineno">13482</span>&#160;                    offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13483"></a><span class="lineno">13483</span>&#160;                    freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13484"></a><span class="lineno">13484</span>&#160;                    VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13485"></a><span class="lineno">13485</span>&#160;                    VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13486"></a><span class="lineno">13486</span>&#160;                VMA_ASSERT(it == pMetadata-&gt;m_Suballocations.end());</div>
+<div class="line"><a name="l13487"></a><span class="lineno">13487</span>&#160;                VmaSuballocationList::iterator trailingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160;                <span class="keywordflow">if</span>(freeSize &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                    pMetadata-&gt;m_FreeSuballocationsBySize.push_back(trailingFreeIt);</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;            }</div>
+<div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160; </div>
+<div class="line"><a name="l13494"></a><span class="lineno">13494</span>&#160;            VMA_SORT(</div>
+<div class="line"><a name="l13495"></a><span class="lineno">13495</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.begin(),</div>
+<div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.end(),</div>
+<div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;                VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l13498"></a><span class="lineno">13498</span>&#160;        }</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;        VMA_HEAVY_ASSERT(pMetadata-&gt;Validate());</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;}</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;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc)</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;    <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div>
+<div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;    VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l13508"></a><span class="lineno">13508</span>&#160;    <span class="keywordflow">while</span>(it != pMetadata-&gt;m_Suballocations.end())</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;        <span class="keywordflow">if</span>(it-&gt;offset &lt; suballoc.offset)</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;            ++it;</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;    }</div>
+<div class="line"><a name="l13515"></a><span class="lineno">13515</span>&#160;    pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13516"></a><span class="lineno">13516</span>&#160;}</div>
+<div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160; </div>
+<div class="line"><a name="l13519"></a><span class="lineno">13519</span>&#160;<span class="comment">// VmaBlockVectorDefragmentationContext</span></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;VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div>
+<div class="line"><a name="l13522"></a><span class="lineno">13522</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13523"></a><span class="lineno">13523</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div>
+<div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160;    uint32_t currFrameIndex) :</div>
+<div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;    res(VK_SUCCESS),</div>
+<div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;    mutexLocked(false),</div>
+<div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;    blockContexts(VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;    m_hCustomPool(hCustomPool),</div>
+<div class="line"><a name="l13531"></a><span class="lineno">13531</span>&#160;    m_pBlockVector(pBlockVector),</div>
+<div class="line"><a name="l13532"></a><span class="lineno">13532</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l13533"></a><span class="lineno">13533</span>&#160;    m_pAlgorithm(VMA_NULL),</div>
+<div class="line"><a name="l13534"></a><span class="lineno">13534</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l13535"></a><span class="lineno">13535</span>&#160;    m_AllAllocations(false)</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;}</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;VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</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;    vma_delete(m_hAllocator, m_pAlgorithm);</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; </div>
+<div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div>
+<div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;{</div>
+<div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;    AllocInfo info = { hAlloc, pChanged };</div>
+<div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;    m_Allocations.push_back(info);</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; </div>
+<div class="line"><a name="l13550"></a><span class="lineno">13550</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported)</div>
+<div class="line"><a name="l13551"></a><span class="lineno">13551</span>&#160;{</div>
+<div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div>
+<div class="line"><a name="l13553"></a><span class="lineno">13553</span>&#160;        m_Allocations.size() == m_pBlockVector-&gt;CalcAllocationCount();</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;<span class="comment">    /********************************</span></div>
+<div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;<span class="comment">    HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div>
+<div class="line"><a name="l13557"></a><span class="lineno">13557</span>&#160;<span class="comment">    ********************************/</span></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="comment">/*</span></div>
+<div class="line"><a name="l13560"></a><span class="lineno">13560</span>&#160;<span class="comment">    Fast algorithm is supported only when certain criteria are met:</span></div>
+<div class="line"><a name="l13561"></a><span class="lineno">13561</span>&#160;<span class="comment">    - VMA_DEBUG_MARGIN is 0.</span></div>
+<div class="line"><a name="l13562"></a><span class="lineno">13562</span>&#160;<span class="comment">    - All allocations in this block vector are moveable.</span></div>
+<div class="line"><a name="l13563"></a><span class="lineno">13563</span>&#160;<span class="comment">    - There is no possibility of image/buffer granularity conflict.</span></div>
+<div class="line"><a name="l13564"></a><span class="lineno">13564</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l13565"></a><span class="lineno">13565</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &amp;&amp;</div>
+<div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;        allAllocations &amp;&amp;</div>
+<div class="line"><a name="l13567"></a><span class="lineno">13567</span>&#160;        !m_pBlockVector-&gt;IsBufferImageGranularityConflictPossible())</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;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div>
+<div class="line"><a name="l13570"></a><span class="lineno">13570</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l13571"></a><span class="lineno">13571</span>&#160;    }</div>
+<div class="line"><a name="l13572"></a><span class="lineno">13572</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160;    {</div>
+<div class="line"><a name="l13574"></a><span class="lineno">13574</span>&#160;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div>
+<div class="line"><a name="l13575"></a><span class="lineno">13575</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;    }</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;    <span class="keywordflow">if</span>(allAllocations)</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;        m_pAlgorithm-&gt;AddAll();</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="keywordflow">else</span></div>
+<div class="line"><a name="l13583"></a><span class="lineno">13583</span>&#160;    {</div>
+<div class="line"><a name="l13584"></a><span class="lineno">13584</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l13585"></a><span class="lineno">13585</span>&#160;        {</div>
+<div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;            m_pAlgorithm-&gt;AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div>
+<div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;        }</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="l13592"></a><span class="lineno">13592</span>&#160;<span class="comment">// VmaDefragmentationContext</span></div>
+<div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160; </div>
+<div class="line"><a name="l13594"></a><span class="lineno">13594</span>&#160;VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div>
+<div class="line"><a name="l13595"></a><span class="lineno">13595</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;    uint32_t currFrameIndex,</div>
+<div class="line"><a name="l13597"></a><span class="lineno">13597</span>&#160;    uint32_t flags,</div>
+<div class="line"><a name="l13598"></a><span class="lineno">13598</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div>
+<div class="line"><a name="l13599"></a><span class="lineno">13599</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l13600"></a><span class="lineno">13600</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l13601"></a><span class="lineno">13601</span>&#160;    m_Flags(flags),</div>
+<div class="line"><a name="l13602"></a><span class="lineno">13602</span>&#160;    m_pStats(pStats),</div>
+<div class="line"><a name="l13603"></a><span class="lineno">13603</span>&#160;    m_CustomPoolContexts(VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l13604"></a><span class="lineno">13604</span>&#160;{</div>
+<div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;    memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</div>
+<div class="line"><a name="l13606"></a><span class="lineno">13606</span>&#160;}</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;VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l13611"></a><span class="lineno">13611</span>&#160;    {</div>
+<div class="line"><a name="l13612"></a><span class="lineno">13612</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13613"></a><span class="lineno">13613</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l13614"></a><span class="lineno">13614</span>&#160;        vma_delete(m_hAllocator, pBlockVectorCtx);</div>
+<div class="line"><a name="l13615"></a><span class="lineno">13615</span>&#160;    }</div>
+<div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator-&gt;m_MemProps.memoryTypeCount; i--; )</div>
+<div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160;    {</div>
+<div class="line"><a name="l13618"></a><span class="lineno">13618</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div>
+<div class="line"><a name="l13619"></a><span class="lineno">13619</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</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;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l13622"></a><span class="lineno">13622</span>&#160;            vma_delete(m_hAllocator, pBlockVectorCtx);</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;}</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="keywordtype">void</span> VmaDefragmentationContext_T::AddPools(uint32_t poolCount, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools)</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;    <span class="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div>
+<div class="line"><a name="l13630"></a><span class="lineno">13630</span>&#160;    {</div>
+<div class="line"><a name="l13631"></a><span class="lineno">13631</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div>
+<div class="line"><a name="l13632"></a><span class="lineno">13632</span>&#160;        VMA_ASSERT(pool);</div>
+<div class="line"><a name="l13633"></a><span class="lineno">13633</span>&#160;        <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l13634"></a><span class="lineno">13634</span>&#160;        <span class="keywordflow">if</span>(pool-&gt;m_BlockVector.GetAlgorithm() == 0)</div>
+<div class="line"><a name="l13635"></a><span class="lineno">13635</span>&#160;        {</div>
+<div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</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;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</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">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == pool)</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;                    pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160;                }</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;            </div>
+<div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</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;                pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;                    m_hAllocator,</div>
+<div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;                    pool,</div>
+<div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160;                    &amp;pool-&gt;m_BlockVector,</div>
+<div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;                    m_CurrFrameIndex);</div>
+<div class="line"><a name="l13654"></a><span class="lineno">13654</span>&#160;                m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</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; </div>
+<div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;            pBlockVectorDefragCtx-&gt;AddAll();</div>
+<div class="line"><a name="l13658"></a><span class="lineno">13658</span>&#160;        }</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;}</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;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div>
+<div class="line"><a name="l13663"></a><span class="lineno">13663</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l13664"></a><span class="lineno">13664</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l13665"></a><span class="lineno">13665</span>&#160;    VkBool32* pAllocationsChanged)</div>
+<div class="line"><a name="l13666"></a><span class="lineno">13666</span>&#160;{</div>
+<div class="line"><a name="l13667"></a><span class="lineno">13667</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div>
+<div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</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;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;        VMA_ASSERT(hAlloc);</div>
+<div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div>
+<div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div>
+<div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div>
+<div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</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;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</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;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetBlock()-&gt;GetParentPool();</div>
+<div class="line"><a name="l13680"></a><span class="lineno">13680</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div>
+<div class="line"><a name="l13681"></a><span class="lineno">13681</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l13682"></a><span class="lineno">13682</span>&#160;            {</div>
+<div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;                <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l13684"></a><span class="lineno">13684</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</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;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l13687"></a><span class="lineno">13687</span>&#160;                    {</div>
+<div class="line"><a name="l13688"></a><span class="lineno">13688</span>&#160;                        <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == hAllocPool)</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;                            pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13691"></a><span class="lineno">13691</span>&#160;                            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13692"></a><span class="lineno">13692</span>&#160;                        }</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>(!pBlockVectorDefragCtx)</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;                        pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;                            m_hAllocator,</div>
+<div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160;                            hAllocPool,</div>
+<div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;                            &amp;hAllocPool-&gt;m_BlockVector,</div>
+<div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160;                            m_CurrFrameIndex);</div>
+<div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;                        m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
+<div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;                    }</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;            }</div>
+<div class="line"><a name="l13705"></a><span class="lineno">13705</span>&#160;            <span class="comment">// This allocation belongs to default pool.</span></div>
+<div class="line"><a name="l13706"></a><span class="lineno">13706</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;                pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l13710"></a><span class="lineno">13710</span>&#160;                <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13711"></a><span class="lineno">13711</span>&#160;                {</div>
+<div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;                    pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;                        m_hAllocator,</div>
+<div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;                        VMA_NULL, <span class="comment">// hCustomPool</span></div>
+<div class="line"><a name="l13715"></a><span class="lineno">13715</span>&#160;                        m_hAllocator-&gt;m_pBlockVectors[memTypeIndex],</div>
+<div class="line"><a name="l13716"></a><span class="lineno">13716</span>&#160;                        m_CurrFrameIndex);</div>
+<div class="line"><a name="l13717"></a><span class="lineno">13717</span>&#160;                    m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</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;            }</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;            <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13722"></a><span class="lineno">13722</span>&#160;            {</div>
+<div class="line"><a name="l13723"></a><span class="lineno">13723</span>&#160;                VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div>
+<div class="line"><a name="l13724"></a><span class="lineno">13724</span>&#160;                    &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div>
+<div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;                pBlockVectorDefragCtx-&gt;AddAllocation(hAlloc, pChanged);</div>
+<div class="line"><a name="l13726"></a><span class="lineno">13726</span>&#160;            }</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;    }</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;VkResult VmaDefragmentationContext_T::Defragment(</div>
+<div class="line"><a name="l13732"></a><span class="lineno">13732</span>&#160;    VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13733"></a><span class="lineno">13733</span>&#160;    VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13734"></a><span class="lineno">13734</span>&#160;    VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
+<div class="line"><a name="l13735"></a><span class="lineno">13735</span>&#160;{</div>
+<div class="line"><a name="l13736"></a><span class="lineno">13736</span>&#160;    <span class="keywordflow">if</span>(pStats)</div>
+<div class="line"><a name="l13737"></a><span class="lineno">13737</span>&#160;    {</div>
+<div class="line"><a name="l13738"></a><span class="lineno">13738</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="l13739"></a><span class="lineno">13739</span>&#160;    }</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">if</span>(commandBuffer == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l13742"></a><span class="lineno">13742</span>&#160;    {</div>
+<div class="line"><a name="l13743"></a><span class="lineno">13743</span>&#160;        maxGpuBytesToMove = 0;</div>
+<div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160;        maxGpuAllocationsToMove = 0;</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 res = VK_SUCCESS;</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;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l13750"></a><span class="lineno">13750</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
+<div class="line"><a name="l13751"></a><span class="lineno">13751</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount() &amp;&amp; res &gt;= VK_SUCCESS;</div>
+<div class="line"><a name="l13752"></a><span class="lineno">13752</span>&#160;        ++memTypeIndex)</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;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l13755"></a><span class="lineno">13755</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l13756"></a><span class="lineno">13756</span>&#160;        {</div>
+<div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l13758"></a><span class="lineno">13758</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l13759"></a><span class="lineno">13759</span>&#160;                pBlockVectorCtx,</div>
+<div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;                pStats,</div>
+<div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;                maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;                maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;                commandBuffer);</div>
+<div class="line"><a name="l13764"></a><span class="lineno">13764</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</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;                res = pBlockVectorCtx-&gt;res;</div>
+<div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;            }</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; </div>
+<div class="line"><a name="l13771"></a><span class="lineno">13771</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
+<div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;        customCtxIndex &lt; customCtxCount &amp;&amp; res &gt;= VK_SUCCESS;</div>
+<div class="line"><a name="l13774"></a><span class="lineno">13774</span>&#160;        ++customCtxIndex)</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;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
+<div class="line"><a name="l13777"></a><span class="lineno">13777</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l13778"></a><span class="lineno">13778</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;            pBlockVectorCtx,</div>
+<div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;            pStats,</div>
+<div class="line"><a name="l13781"></a><span class="lineno">13781</span>&#160;            maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13782"></a><span class="lineno">13782</span>&#160;            maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;            commandBuffer);</div>
+<div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</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;            res = pBlockVectorCtx-&gt;res;</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; </div>
+<div class="line"><a name="l13790"></a><span class="lineno">13790</span>&#160;    <span class="keywordflow">return</span> res;</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; </div>
+<div class="line"><a name="l13794"></a><span class="lineno">13794</span>&#160;<span class="comment">// VmaRecorder</span></div>
+<div class="line"><a name="l13795"></a><span class="lineno">13795</span>&#160; </div>
+<div class="line"><a name="l13796"></a><span class="lineno">13796</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></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;VmaRecorder::VmaRecorder() :</div>
+<div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160;    m_UseMutex(true),</div>
+<div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160;    m_Flags(0),</div>
+<div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;    m_File(VMA_NULL),</div>
+<div class="line"><a name="l13802"></a><span class="lineno">13802</span>&#160;    m_Freq(INT64_MAX),</div>
+<div class="line"><a name="l13803"></a><span class="lineno">13803</span>&#160;    m_StartCounter(INT64_MAX)</div>
+<div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;{</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;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="l13808"></a><span class="lineno">13808</span>&#160;{</div>
+<div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;    m_UseMutex = useMutex;</div>
+<div class="line"><a name="l13810"></a><span class="lineno">13810</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</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;    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;m_Freq);</div>
+<div class="line"><a name="l13813"></a><span class="lineno">13813</span>&#160;    QueryPerformanceCounter((LARGE_INTEGER*)&amp;m_StartCounter);</div>
+<div class="line"><a name="l13814"></a><span class="lineno">13814</span>&#160; </div>
+<div class="line"><a name="l13815"></a><span class="lineno">13815</span>&#160;    <span class="comment">// Open file for writing.</span></div>
+<div class="line"><a name="l13816"></a><span class="lineno">13816</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="l13817"></a><span class="lineno">13817</span>&#160;    <span class="keywordflow">if</span>(err != 0)</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;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</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; </div>
+<div class="line"><a name="l13822"></a><span class="lineno">13822</span>&#160;    <span class="comment">// Write header.</span></div>
+<div class="line"><a name="l13823"></a><span class="lineno">13823</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="l13824"></a><span class="lineno">13824</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,6&quot;</span>);</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;    <span class="keywordflow">return</span> VK_SUCCESS;</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; </div>
+<div class="line"><a name="l13829"></a><span class="lineno">13829</span>&#160;VmaRecorder::~VmaRecorder()</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;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div>
+<div class="line"><a name="l13832"></a><span class="lineno">13832</span>&#160;    {</div>
+<div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160;        fclose(m_File);</div>
+<div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    }</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;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;{</div>
+<div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l13840"></a><span class="lineno">13840</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13843"></a><span class="lineno">13843</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="l13844"></a><span class="lineno">13844</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;{</div>
+<div class="line"><a name="l13849"></a><span class="lineno">13849</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l13850"></a><span class="lineno">13850</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13853"></a><span class="lineno">13853</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="l13854"></a><span class="lineno">13854</span>&#160;    Flush();</div>
+<div class="line"><a name="l13855"></a><span class="lineno">13855</span>&#160;}</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;<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="l13858"></a><span class="lineno">13858</span>&#160;{</div>
+<div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l13860"></a><span class="lineno">13860</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13861"></a><span class="lineno">13861</span>&#160; </div>
+<div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13863"></a><span class="lineno">13863</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="l13864"></a><span class="lineno">13864</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div>
+<div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div>
+<div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div>
+<div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div>
+<div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div>
+<div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div>
+<div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;        pool);</div>
+<div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l13874"></a><span class="lineno">13874</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="l13875"></a><span class="lineno">13875</span>&#160;{</div>
+<div class="line"><a name="l13876"></a><span class="lineno">13876</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l13877"></a><span class="lineno">13877</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13880"></a><span class="lineno">13880</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="l13881"></a><span class="lineno">13881</span>&#160;        pool);</div>
+<div class="line"><a name="l13882"></a><span class="lineno">13882</span>&#160;    Flush();</div>
+<div class="line"><a name="l13883"></a><span class="lineno">13883</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l13887"></a><span class="lineno">13887</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="l13888"></a><span class="lineno">13888</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160; </div>
+<div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13894"></a><span class="lineno">13894</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="l13895"></a><span class="lineno">13895</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="l13896"></a><span class="lineno">13896</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l13905"></a><span class="lineno">13905</span>&#160;        allocation,</div>
+<div class="line"><a name="l13906"></a><span class="lineno">13906</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l13907"></a><span class="lineno">13907</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l13910"></a><span class="lineno">13910</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l13911"></a><span class="lineno">13911</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l13912"></a><span class="lineno">13912</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="l13913"></a><span class="lineno">13913</span>&#160;    uint64_t allocationCount,</div>
+<div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l13915"></a><span class="lineno">13915</span>&#160;{</div>
+<div class="line"><a name="l13916"></a><span class="lineno">13916</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13918"></a><span class="lineno">13918</span>&#160; </div>
+<div class="line"><a name="l13919"></a><span class="lineno">13919</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13920"></a><span class="lineno">13920</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="l13921"></a><span class="lineno">13921</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l13922"></a><span class="lineno">13922</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l13923"></a><span class="lineno">13923</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l13925"></a><span class="lineno">13925</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l13926"></a><span class="lineno">13926</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l13927"></a><span class="lineno">13927</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l13928"></a><span class="lineno">13928</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div>
+<div class="line"><a name="l13931"></a><span class="lineno">13931</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l13932"></a><span class="lineno">13932</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%s\n&quot;</span>, userDataStr.GetString());</div>
+<div class="line"><a name="l13933"></a><span class="lineno">13933</span>&#160;    Flush();</div>
+<div class="line"><a name="l13934"></a><span class="lineno">13934</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l13939"></a><span class="lineno">13939</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l13940"></a><span class="lineno">13940</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="l13941"></a><span class="lineno">13941</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160; </div>
+<div class="line"><a name="l13946"></a><span class="lineno">13946</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13947"></a><span class="lineno">13947</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="l13948"></a><span class="lineno">13948</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="l13949"></a><span class="lineno">13949</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l13951"></a><span class="lineno">13951</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l13952"></a><span class="lineno">13952</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l13954"></a><span class="lineno">13954</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l13955"></a><span class="lineno">13955</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l13958"></a><span class="lineno">13958</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l13959"></a><span class="lineno">13959</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160;        allocation,</div>
+<div class="line"><a name="l13961"></a><span class="lineno">13961</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l13962"></a><span class="lineno">13962</span>&#160;    Flush();</div>
+<div class="line"><a name="l13963"></a><span class="lineno">13963</span>&#160;}</div>
+<div class="line"><a name="l13964"></a><span class="lineno">13964</span>&#160; </div>
+<div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l13969"></a><span class="lineno">13969</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="l13970"></a><span class="lineno">13970</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160; </div>
+<div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13976"></a><span class="lineno">13976</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="l13977"></a><span class="lineno">13977</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="l13978"></a><span class="lineno">13978</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l13980"></a><span class="lineno">13980</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l13981"></a><span class="lineno">13981</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l13989"></a><span class="lineno">13989</span>&#160;        allocation,</div>
+<div class="line"><a name="l13990"></a><span class="lineno">13990</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l13991"></a><span class="lineno">13991</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l13994"></a><span class="lineno">13994</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160; </div>
+<div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14001"></a><span class="lineno">14001</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="l14002"></a><span class="lineno">14002</span>&#160;        allocation);</div>
+<div class="line"><a name="l14003"></a><span class="lineno">14003</span>&#160;    Flush();</div>
+<div class="line"><a name="l14004"></a><span class="lineno">14004</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l14007"></a><span class="lineno">14007</span>&#160;    uint64_t allocationCount,</div>
+<div class="line"><a name="l14008"></a><span class="lineno">14008</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160; </div>
+<div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemoryPages,&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l14015"></a><span class="lineno">14015</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l14016"></a><span class="lineno">14016</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;\n&quot;</span>);</div>
+<div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div>
+<div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l14022"></a><span class="lineno">14022</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l14023"></a><span class="lineno">14023</span>&#160;{</div>
+<div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;    UserDataString userDataStr(</div>
+<div class="line"><a name="l14029"></a><span class="lineno">14029</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="l14030"></a><span class="lineno">14030</span>&#160;        pUserData);</div>
+<div class="line"><a name="l14031"></a><span class="lineno">14031</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="l14032"></a><span class="lineno">14032</span>&#160;        allocation,</div>
+<div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14037"></a><span class="lineno">14037</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14038"></a><span class="lineno">14038</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14044"></a><span class="lineno">14044</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="l14045"></a><span class="lineno">14045</span>&#160;        allocation);</div>
+<div class="line"><a name="l14046"></a><span class="lineno">14046</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14049"></a><span class="lineno">14049</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</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;{</div>
+<div class="line"><a name="l14052"></a><span class="lineno">14052</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14053"></a><span class="lineno">14053</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14056"></a><span class="lineno">14056</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="l14057"></a><span class="lineno">14057</span>&#160;        allocation);</div>
+<div class="line"><a name="l14058"></a><span class="lineno">14058</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14061"></a><span class="lineno">14061</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l14062"></a><span class="lineno">14062</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14063"></a><span class="lineno">14063</span>&#160;{</div>
+<div class="line"><a name="l14064"></a><span class="lineno">14064</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14065"></a><span class="lineno">14065</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14068"></a><span class="lineno">14068</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="l14069"></a><span class="lineno">14069</span>&#160;        allocation);</div>
+<div class="line"><a name="l14070"></a><span class="lineno">14070</span>&#160;    Flush();</div>
+<div class="line"><a name="l14071"></a><span class="lineno">14071</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160; </div>
+<div class="line"><a name="l14079"></a><span class="lineno">14079</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14080"></a><span class="lineno">14080</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="l14081"></a><span class="lineno">14081</span>&#160;        allocation,</div>
+<div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160;        offset,</div>
+<div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;        size);</div>
+<div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160;    Flush();</div>
+<div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14088"></a><span class="lineno">14088</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14091"></a><span class="lineno">14091</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14092"></a><span class="lineno">14092</span>&#160; </div>
+<div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14094"></a><span class="lineno">14094</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="l14095"></a><span class="lineno">14095</span>&#160;        allocation,</div>
+<div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;        offset,</div>
+<div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160;        size);</div>
+<div class="line"><a name="l14098"></a><span class="lineno">14098</span>&#160;    Flush();</div>
+<div class="line"><a name="l14099"></a><span class="lineno">14099</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l14102"></a><span class="lineno">14102</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
+<div class="line"><a name="l14103"></a><span class="lineno">14103</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="l14104"></a><span class="lineno">14104</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14107"></a><span class="lineno">14107</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14110"></a><span class="lineno">14110</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="l14111"></a><span class="lineno">14111</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="l14112"></a><span class="lineno">14112</span>&#160;        bufCreateInfo.flags,</div>
+<div class="line"><a name="l14113"></a><span class="lineno">14113</span>&#160;        bufCreateInfo.size,</div>
+<div class="line"><a name="l14114"></a><span class="lineno">14114</span>&#160;        bufCreateInfo.usage,</div>
+<div class="line"><a name="l14115"></a><span class="lineno">14115</span>&#160;        bufCreateInfo.sharingMode,</div>
+<div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14117"></a><span class="lineno">14117</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14118"></a><span class="lineno">14118</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14120"></a><span class="lineno">14120</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14121"></a><span class="lineno">14121</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14122"></a><span class="lineno">14122</span>&#160;        allocation,</div>
+<div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l14124"></a><span class="lineno">14124</span>&#160;    Flush();</div>
+<div class="line"><a name="l14125"></a><span class="lineno">14125</span>&#160;}</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;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l14128"></a><span class="lineno">14128</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
+<div class="line"><a name="l14129"></a><span class="lineno">14129</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="l14130"></a><span class="lineno">14130</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> 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;    CallParams callParams;</div>
+<div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14136"></a><span class="lineno">14136</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="l14137"></a><span class="lineno">14137</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="l14138"></a><span class="lineno">14138</span>&#160;        imageCreateInfo.flags,</div>
+<div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;        imageCreateInfo.imageType,</div>
+<div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;        imageCreateInfo.format,</div>
+<div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;        imageCreateInfo.extent.width,</div>
+<div class="line"><a name="l14142"></a><span class="lineno">14142</span>&#160;        imageCreateInfo.extent.height,</div>
+<div class="line"><a name="l14143"></a><span class="lineno">14143</span>&#160;        imageCreateInfo.extent.depth,</div>
+<div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160;        imageCreateInfo.mipLevels,</div>
+<div class="line"><a name="l14145"></a><span class="lineno">14145</span>&#160;        imageCreateInfo.arrayLayers,</div>
+<div class="line"><a name="l14146"></a><span class="lineno">14146</span>&#160;        imageCreateInfo.samples,</div>
+<div class="line"><a name="l14147"></a><span class="lineno">14147</span>&#160;        imageCreateInfo.tiling,</div>
+<div class="line"><a name="l14148"></a><span class="lineno">14148</span>&#160;        imageCreateInfo.usage,</div>
+<div class="line"><a name="l14149"></a><span class="lineno">14149</span>&#160;        imageCreateInfo.sharingMode,</div>
+<div class="line"><a name="l14150"></a><span class="lineno">14150</span>&#160;        imageCreateInfo.initialLayout,</div>
+<div class="line"><a name="l14151"></a><span class="lineno">14151</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14153"></a><span class="lineno">14153</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14154"></a><span class="lineno">14154</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14155"></a><span class="lineno">14155</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14156"></a><span class="lineno">14156</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160;        allocation,</div>
+<div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l14159"></a><span class="lineno">14159</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14162"></a><span class="lineno">14162</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l14163"></a><span class="lineno">14163</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160;{</div>
+<div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160; </div>
+<div class="line"><a name="l14168"></a><span class="lineno">14168</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14169"></a><span class="lineno">14169</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="l14170"></a><span class="lineno">14170</span>&#160;        allocation);</div>
+<div class="line"><a name="l14171"></a><span class="lineno">14171</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14174"></a><span class="lineno">14174</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14178"></a><span class="lineno">14178</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14181"></a><span class="lineno">14181</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="l14182"></a><span class="lineno">14182</span>&#160;        allocation);</div>
+<div class="line"><a name="l14183"></a><span class="lineno">14183</span>&#160;    Flush();</div>
+<div class="line"><a name="l14184"></a><span class="lineno">14184</span>&#160;}</div>
+<div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160; </div>
+<div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14187"></a><span class="lineno">14187</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14188"></a><span class="lineno">14188</span>&#160;{</div>
+<div class="line"><a name="l14189"></a><span class="lineno">14189</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14190"></a><span class="lineno">14190</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14193"></a><span class="lineno">14193</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="l14194"></a><span class="lineno">14194</span>&#160;        allocation);</div>
+<div class="line"><a name="l14195"></a><span class="lineno">14195</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14198"></a><span class="lineno">14198</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div>
+<div class="line"><a name="l14199"></a><span class="lineno">14199</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14200"></a><span class="lineno">14200</span>&#160;{</div>
+<div class="line"><a name="l14201"></a><span class="lineno">14201</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14202"></a><span class="lineno">14202</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14205"></a><span class="lineno">14205</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="l14206"></a><span class="lineno">14206</span>&#160;        allocation);</div>
+<div class="line"><a name="l14207"></a><span class="lineno">14207</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14210"></a><span class="lineno">14210</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
+<div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14214"></a><span class="lineno">14214</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14217"></a><span class="lineno">14217</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="l14218"></a><span class="lineno">14218</span>&#160;        pool);</div>
+<div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160;    Flush();</div>
+<div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;}</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="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div>
+<div class="line"><a name="l14223"></a><span class="lineno">14223</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="l14224"></a><span class="lineno">14224</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
+<div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;{</div>
+<div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;    GetBasicParams(callParams);</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;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationBegin,%u,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14231"></a><span class="lineno">14231</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
+<div class="line"><a name="l14232"></a><span class="lineno">14232</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>);</div>
+<div class="line"><a name="l14233"></a><span class="lineno">14233</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,&quot;</span>);</div>
+<div class="line"><a name="l14234"></a><span class="lineno">14234</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>);</div>
+<div class="line"><a name="l14235"></a><span class="lineno">14235</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%llu,%u,%llu,%u,%p,%p\n&quot;</span>,</div>
+<div class="line"><a name="l14236"></a><span class="lineno">14236</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div>
+<div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l14238"></a><span class="lineno">14238</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div>
+<div class="line"><a name="l14239"></a><span class="lineno">14239</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l14240"></a><span class="lineno">14240</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div>
+<div class="line"><a name="l14241"></a><span class="lineno">14241</span>&#160;        ctx);</div>
+<div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14245"></a><span class="lineno">14245</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div>
+<div class="line"><a name="l14246"></a><span class="lineno">14246</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</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;    CallParams callParams;</div>
+<div class="line"><a name="l14249"></a><span class="lineno">14249</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160; </div>
+<div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationEnd,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;        ctx);</div>
+<div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;    Flush();</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; </div>
+<div class="line"><a name="l14257"></a><span class="lineno">14257</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="l14258"></a><span class="lineno">14258</span>&#160;{</div>
+<div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</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;        <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="l14262"></a><span class="lineno">14262</span>&#160;        {</div>
+<div class="line"><a name="l14263"></a><span class="lineno">14263</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</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">else</span></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;            sprintf_s(m_PtrStr, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div>
+<div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;            m_Str = m_PtrStr;</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;    }</div>
+<div class="line"><a name="l14271"></a><span class="lineno">14271</span>&#160;    <span class="keywordflow">else</span></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;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</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;}</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;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div>
+<div class="line"><a name="l14278"></a><span class="lineno">14278</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
+<div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
+<div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
+<div class="line"><a name="l14281"></a><span class="lineno">14281</span>&#160;    <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled)</div>
+<div class="line"><a name="l14282"></a><span class="lineno">14282</span>&#160;{</div>
+<div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</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;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div>
+<div class="line"><a name="l14286"></a><span class="lineno">14286</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div>
+<div class="line"><a name="l14287"></a><span class="lineno">14287</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div>
+<div class="line"><a name="l14288"></a><span class="lineno">14288</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div>
+<div class="line"><a name="l14289"></a><span class="lineno">14289</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div>
+<div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</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;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div>
+<div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div>
+<div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</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;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div>
+<div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</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;        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="l14300"></a><span class="lineno">14300</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="l14301"></a><span class="lineno">14301</span>&#160;    }</div>
+<div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div>
+<div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</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;        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="l14306"></a><span class="lineno">14306</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="l14307"></a><span class="lineno">14307</span>&#160;    }</div>
+<div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160; </div>
+<div class="line"><a name="l14309"></a><span class="lineno">14309</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="l14310"></a><span class="lineno">14310</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_bind_memory2,%u\n&quot;</span>, bindMemory2ExtensionEnabled ? 1 : 0);</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;    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="l14313"></a><span class="lineno">14313</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="l14314"></a><span class="lineno">14314</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="l14315"></a><span class="lineno">14315</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="l14316"></a><span class="lineno">14316</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="l14317"></a><span class="lineno">14317</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="l14318"></a><span class="lineno">14318</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="l14319"></a><span class="lineno">14319</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="l14320"></a><span class="lineno">14320</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="l14321"></a><span class="lineno">14321</span>&#160; </div>
+<div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div>
+<div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;}</div>
+<div class="line"><a name="l14324"></a><span class="lineno">14324</span>&#160; </div>
+<div class="line"><a name="l14325"></a><span class="lineno">14325</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</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;    outParams.threadId = GetCurrentThreadId();</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;    LARGE_INTEGER counter;</div>
+<div class="line"><a name="l14330"></a><span class="lineno">14330</span>&#160;    QueryPerformanceCounter(&amp;counter);</div>
+<div class="line"><a name="l14331"></a><span class="lineno">14331</span>&#160;    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</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; </div>
+<div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160;<span class="keywordtype">void</span> VmaRecorder::PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems)</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;    <span class="keywordflow">if</span>(count)</div>
+<div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;    {</div>
+<div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
+<div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;        <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</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;            fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</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;    }</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; </div>
+<div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div>
+<div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160;{</div>
+<div class="line"><a name="l14348"></a><span class="lineno">14348</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="l14349"></a><span class="lineno">14349</span>&#160;    {</div>
+<div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;        fflush(m_File);</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;}</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="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160; </div>
+<div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;<span class="comment">// VmaAllocationObjectAllocator</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;VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;    m_Allocator(pAllocationCallbacks, 1024)</div>
+<div class="line"><a name="l14361"></a><span class="lineno">14361</span>&#160;{</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;<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate()</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;    VmaMutexLock mutexLock(m_Mutex);</div>
+<div class="line"><a name="l14367"></a><span class="lineno">14367</span>&#160;    <span class="keywordflow">return</span> m_Allocator.Alloc();</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; </div>
+<div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;<span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</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;    VmaMutexLock mutexLock(m_Mutex);</div>
+<div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;    m_Allocator.Free(hAlloc);</div>
+<div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;}</div>
+<div class="line"><a name="l14375"></a><span class="lineno">14375</span>&#160; </div>
+<div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;<span class="comment">// VmaAllocator_T</span></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;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="l14380"></a><span class="lineno">14380</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="l14381"></a><span class="lineno">14381</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="l14382"></a><span class="lineno">14382</span>&#160;    m_UseKhrBindMemory2((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0),</div>
+<div class="line"><a name="l14383"></a><span class="lineno">14383</span>&#160;    m_UseExtMemoryBudget((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0),</div>
+<div class="line"><a name="l14384"></a><span class="lineno">14384</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div>
+<div class="line"><a name="l14385"></a><span class="lineno">14385</span>&#160;    m_hInstance(pCreateInfo-&gt;instance),</div>
+<div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div>
+<div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div>
+<div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div>
+<div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;    m_AllocationObjectAllocator(&amp;m_AllocationCallbacks),</div>
+<div class="line"><a name="l14390"></a><span class="lineno">14390</span>&#160;    m_HeapSizeLimitMask(0),</div>
+<div class="line"><a name="l14391"></a><span class="lineno">14391</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div>
+<div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div>
+<div class="line"><a name="l14393"></a><span class="lineno">14393</span>&#160;    m_CurrentFrameIndex(0),</div>
+<div class="line"><a name="l14394"></a><span class="lineno">14394</span>&#160;    m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div>
+<div class="line"><a name="l14395"></a><span class="lineno">14395</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div>
+<div class="line"><a name="l14396"></a><span class="lineno">14396</span>&#160;    m_NextPoolId(0)</div>
+<div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div>
+<div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;    ,m_pRecorder(VMA_NULL)</div>
+<div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;#endif</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="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</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;        <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="l14404"></a><span class="lineno">14404</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div>
+<div class="line"><a name="l14405"></a><span class="lineno">14405</span>&#160;    }</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;    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="l14408"></a><span class="lineno">14408</span>&#160; </div>
+<div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div>
+<div class="line"><a name="l14410"></a><span class="lineno">14410</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="l14411"></a><span class="lineno">14411</span>&#160;    {</div>
+<div class="line"><a name="l14412"></a><span class="lineno">14412</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="l14413"></a><span class="lineno">14413</span>&#160;    }</div>
+<div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;<span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div>
+<div class="line"><a name="l14416"></a><span class="lineno">14416</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#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</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;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14421"></a><span class="lineno">14421</span>&#160;<span class="preprocessor">#if !(VMA_MEMORY_BUDGET)</span></div>
+<div class="line"><a name="l14422"></a><span class="lineno">14422</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#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0)</div>
+<div class="line"><a name="l14423"></a><span class="lineno">14423</span>&#160;    {</div>
+<div class="line"><a name="l14424"></a><span class="lineno">14424</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</div>
+<div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;    }</div>
+<div class="line"><a name="l14426"></a><span class="lineno">14426</span>&#160;<span class="preprocessor">#endif</span></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;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div>
+<div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div>
+<div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</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;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div>
+<div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div>
+<div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;    memset(&amp;m_VulkanFunctions, 0, <span class="keyword">sizeof</span>(m_VulkanFunctions));</div>
+<div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160; </div>
+<div class="line"><a name="l14436"></a><span class="lineno">14436</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="l14437"></a><span class="lineno">14437</span>&#160;    {</div>
+<div class="line"><a name="l14438"></a><span class="lineno">14438</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="l14439"></a><span class="lineno">14439</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="l14440"></a><span class="lineno">14440</span>&#160;    }</div>
+<div class="line"><a name="l14441"></a><span class="lineno">14441</span>&#160; </div>
+<div class="line"><a name="l14442"></a><span class="lineno">14442</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div>
+<div class="line"><a name="l14443"></a><span class="lineno">14443</span>&#160; </div>
+<div class="line"><a name="l14444"></a><span class="lineno">14444</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div>
+<div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</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;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div>
+<div class="line"><a name="l14448"></a><span class="lineno">14448</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div>
+<div class="line"><a name="l14449"></a><span class="lineno">14449</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div>
+<div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div>
+<div class="line"><a name="l14451"></a><span class="lineno">14451</span>&#160; </div>
+<div class="line"><a name="l14452"></a><span class="lineno">14452</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="l14453"></a><span class="lineno">14453</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="l14454"></a><span class="lineno">14454</span>&#160; </div>
+<div class="line"><a name="l14455"></a><span class="lineno">14455</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="l14456"></a><span class="lineno">14456</span>&#160;    {</div>
+<div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l14458"></a><span class="lineno">14458</span>&#160;        {</div>
+<div class="line"><a name="l14459"></a><span class="lineno">14459</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="l14460"></a><span class="lineno">14460</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;            {</div>
+<div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160;                m_HeapSizeLimitMask |= 1u &lt;&lt; heapIndex;</div>
+<div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div>
+<div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;                {</div>
+<div class="line"><a name="l14465"></a><span class="lineno">14465</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div>
+<div class="line"><a name="l14466"></a><span class="lineno">14466</span>&#160;                }</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;        }</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="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l14472"></a><span class="lineno">14472</span>&#160;    {</div>
+<div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</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;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div>
+<div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;            <span class="keyword">this</span>,</div>
+<div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div>
+<div class="line"><a name="l14478"></a><span class="lineno">14478</span>&#160;            memTypeIndex,</div>
+<div class="line"><a name="l14479"></a><span class="lineno">14479</span>&#160;            preferredBlockSize,</div>
+<div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;            0,</div>
+<div class="line"><a name="l14481"></a><span class="lineno">14481</span>&#160;            SIZE_MAX,</div>
+<div class="line"><a name="l14482"></a><span class="lineno">14482</span>&#160;            GetBufferImageGranularity(),</div>
+<div class="line"><a name="l14483"></a><span class="lineno">14483</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div>
+<div class="line"><a name="l14484"></a><span class="lineno">14484</span>&#160;            <span class="keyword">false</span>, <span class="comment">// isCustomPool</span></div>
+<div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div>
+<div class="line"><a name="l14486"></a><span class="lineno">14486</span>&#160;            <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div>
+<div class="line"><a name="l14487"></a><span class="lineno">14487</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div>
+<div class="line"><a name="l14488"></a><span class="lineno">14488</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div>
+<div class="line"><a name="l14489"></a><span class="lineno">14489</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</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;}</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;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="l14495"></a><span class="lineno">14495</span>&#160;{</div>
+<div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;    VkResult res = VK_SUCCESS;</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;    <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="l14499"></a><span class="lineno">14499</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="l14500"></a><span class="lineno">14500</span>&#160;    {</div>
+<div class="line"><a name="l14501"></a><span class="lineno">14501</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div>
+<div class="line"><a name="l14503"></a><span class="lineno">14503</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="l14504"></a><span class="lineno">14504</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</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;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14507"></a><span class="lineno">14507</span>&#160;        }</div>
+<div class="line"><a name="l14508"></a><span class="lineno">14508</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div>
+<div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;            m_PhysicalDeviceProperties,</div>
+<div class="line"><a name="l14510"></a><span class="lineno">14510</span>&#160;            m_MemProps,</div>
+<div class="line"><a name="l14511"></a><span class="lineno">14511</span>&#160;            m_UseKhrDedicatedAllocation,</div>
+<div class="line"><a name="l14512"></a><span class="lineno">14512</span>&#160;            m_UseKhrBindMemory2);</div>
+<div class="line"><a name="l14513"></a><span class="lineno">14513</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l14514"></a><span class="lineno">14514</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l14515"></a><span class="lineno">14515</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="l14516"></a><span class="lineno">14516</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160;<span class="preprocessor">#endif</span></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; </div>
+<div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</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;        UpdateVulkanBudget();</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;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160; </div>
+<div class="line"><a name="l14527"></a><span class="lineno">14527</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14528"></a><span class="lineno">14528</span>&#160;}</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;VmaAllocator_T::~VmaAllocator_T()</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="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14533"></a><span class="lineno">14533</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div>
+<div class="line"><a name="l14534"></a><span class="lineno">14534</span>&#160;    {</div>
+<div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l14536"></a><span class="lineno">14536</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</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;<span class="preprocessor">#endif</span></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;    VMA_ASSERT(m_Pools.empty());</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div>
+<div class="line"><a name="l14543"></a><span class="lineno">14543</span>&#160;    {</div>
+<div class="line"><a name="l14544"></a><span class="lineno">14544</span>&#160;        <span class="keywordflow">if</span>(m_pDedicatedAllocations[i] != VMA_NULL &amp;&amp; !m_pDedicatedAllocations[i]-&gt;empty())</div>
+<div class="line"><a name="l14545"></a><span class="lineno">14545</span>&#160;        {</div>
+<div class="line"><a name="l14546"></a><span class="lineno">14546</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unfreed dedicated allocations found.&quot;</span>);</div>
+<div class="line"><a name="l14547"></a><span class="lineno">14547</span>&#160;        }</div>
+<div class="line"><a name="l14548"></a><span class="lineno">14548</span>&#160; </div>
+<div class="line"><a name="l14549"></a><span class="lineno">14549</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div>
+<div class="line"><a name="l14550"></a><span class="lineno">14550</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</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;}</div>
+<div class="line"><a name="l14553"></a><span class="lineno">14553</span>&#160; </div>
+<div class="line"><a name="l14554"></a><span class="lineno">14554</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="l14555"></a><span class="lineno">14555</span>&#160;{</div>
+<div class="line"><a name="l14556"></a><span class="lineno">14556</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l14557"></a><span class="lineno">14557</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div>
+<div class="line"><a name="l14558"></a><span class="lineno">14558</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div>
+<div class="line"><a name="l14559"></a><span class="lineno">14559</span>&#160;    m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div>
+<div class="line"><a name="l14560"></a><span class="lineno">14560</span>&#160;    m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div>
+<div class="line"><a name="l14561"></a><span class="lineno">14561</span>&#160;    m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div>
+<div class="line"><a name="l14562"></a><span class="lineno">14562</span>&#160;    m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div>
+<div class="line"><a name="l14563"></a><span class="lineno">14563</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div>
+<div class="line"><a name="l14564"></a><span class="lineno">14564</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div>
+<div class="line"><a name="l14565"></a><span class="lineno">14565</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div>
+<div class="line"><a name="l14566"></a><span class="lineno">14566</span>&#160;    m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div>
+<div class="line"><a name="l14567"></a><span class="lineno">14567</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div>
+<div class="line"><a name="l14568"></a><span class="lineno">14568</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div>
+<div class="line"><a name="l14569"></a><span class="lineno">14569</span>&#160;    m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div>
+<div class="line"><a name="l14570"></a><span class="lineno">14570</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div>
+<div class="line"><a name="l14571"></a><span class="lineno">14571</span>&#160;    m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div>
+<div class="line"><a name="l14572"></a><span class="lineno">14572</span>&#160;    m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div>
+<div class="line"><a name="l14573"></a><span class="lineno">14573</span>&#160;    m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div>
+<div class="line"><a name="l14574"></a><span class="lineno">14574</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14575"></a><span class="lineno">14575</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14576"></a><span class="lineno">14576</span>&#160;    {</div>
+<div class="line"><a name="l14577"></a><span class="lineno">14577</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14578"></a><span class="lineno">14578</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div>
+<div class="line"><a name="l14579"></a><span class="lineno">14579</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14580"></a><span class="lineno">14580</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div>
+<div class="line"><a name="l14581"></a><span class="lineno">14581</span>&#160;    }</div>
+<div class="line"><a name="l14582"></a><span class="lineno">14582</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14583"></a><span class="lineno">14583</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14584"></a><span class="lineno">14584</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l14585"></a><span class="lineno">14585</span>&#160;    {</div>
+<div class="line"><a name="l14586"></a><span class="lineno">14586</span>&#160;        m_VulkanFunctions.vkBindBufferMemory2KHR =</div>
+<div class="line"><a name="l14587"></a><span class="lineno">14587</span>&#160;            (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkBindBufferMemory2KHR&quot;</span>);</div>
+<div class="line"><a name="l14588"></a><span class="lineno">14588</span>&#160;        m_VulkanFunctions.vkBindImageMemory2KHR =</div>
+<div class="line"><a name="l14589"></a><span class="lineno">14589</span>&#160;            (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkBindImageMemory2KHR&quot;</span>);</div>
+<div class="line"><a name="l14590"></a><span class="lineno">14590</span>&#160;    }</div>
+<div class="line"><a name="l14591"></a><span class="lineno">14591</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14592"></a><span class="lineno">14592</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14593"></a><span class="lineno">14593</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l14594"></a><span class="lineno">14594</span>&#160;    {</div>
+<div class="line"><a name="l14595"></a><span class="lineno">14595</span>&#160;        VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l14596"></a><span class="lineno">14596</span>&#160;        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =</div>
+<div class="line"><a name="l14597"></a><span class="lineno">14597</span>&#160;            (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties2KHR&quot;</span>);</div>
+<div class="line"><a name="l14598"></a><span class="lineno">14598</span>&#160;    }</div>
+<div class="line"><a name="l14599"></a><span class="lineno">14599</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14600"></a><span class="lineno">14600</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></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;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div>
+<div class="line"><a name="l14603"></a><span class="lineno">14603</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div>
+<div class="line"><a name="l14604"></a><span class="lineno">14604</span>&#160; </div>
+<div class="line"><a name="l14605"></a><span class="lineno">14605</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div>
+<div class="line"><a name="l14606"></a><span class="lineno">14606</span>&#160;    {</div>
+<div class="line"><a name="l14607"></a><span class="lineno">14607</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div>
+<div class="line"><a name="l14608"></a><span class="lineno">14608</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l14609"></a><span class="lineno">14609</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div>
+<div class="line"><a name="l14610"></a><span class="lineno">14610</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div>
+<div class="line"><a name="l14611"></a><span class="lineno">14611</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div>
+<div class="line"><a name="l14612"></a><span class="lineno">14612</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div>
+<div class="line"><a name="l14613"></a><span class="lineno">14613</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div>
+<div class="line"><a name="l14614"></a><span class="lineno">14614</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div>
+<div class="line"><a name="l14615"></a><span class="lineno">14615</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div>
+<div class="line"><a name="l14616"></a><span class="lineno">14616</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div>
+<div class="line"><a name="l14617"></a><span class="lineno">14617</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div>
+<div class="line"><a name="l14618"></a><span class="lineno">14618</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div>
+<div class="line"><a name="l14619"></a><span class="lineno">14619</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div>
+<div class="line"><a name="l14620"></a><span class="lineno">14620</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div>
+<div class="line"><a name="l14621"></a><span class="lineno">14621</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div>
+<div class="line"><a name="l14622"></a><span class="lineno">14622</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div>
+<div class="line"><a name="l14623"></a><span class="lineno">14623</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div>
+<div class="line"><a name="l14624"></a><span class="lineno">14624</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14625"></a><span class="lineno">14625</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div>
+<div class="line"><a name="l14626"></a><span class="lineno">14626</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div>
+<div class="line"><a name="l14627"></a><span class="lineno">14627</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14628"></a><span class="lineno">14628</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14629"></a><span class="lineno">14629</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div>
+<div class="line"><a name="l14630"></a><span class="lineno">14630</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div>
+<div class="line"><a name="l14631"></a><span class="lineno">14631</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14632"></a><span class="lineno">14632</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14633"></a><span class="lineno">14633</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);</div>
+<div class="line"><a name="l14634"></a><span class="lineno">14634</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div>
+<div class="line"><a name="l14638"></a><span class="lineno">14638</span>&#160; </div>
+<div class="line"><a name="l14639"></a><span class="lineno">14639</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="l14640"></a><span class="lineno">14640</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div>
+<div class="line"><a name="l14641"></a><span class="lineno">14641</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div>
+<div class="line"><a name="l14642"></a><span class="lineno">14642</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div>
+<div class="line"><a name="l14643"></a><span class="lineno">14643</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div>
+<div class="line"><a name="l14644"></a><span class="lineno">14644</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div>
+<div class="line"><a name="l14645"></a><span class="lineno">14645</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div>
+<div class="line"><a name="l14646"></a><span class="lineno">14646</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div>
+<div class="line"><a name="l14647"></a><span class="lineno">14647</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l14648"></a><span class="lineno">14648</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l14649"></a><span class="lineno">14649</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div>
+<div class="line"><a name="l14650"></a><span class="lineno">14650</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div>
+<div class="line"><a name="l14651"></a><span class="lineno">14651</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l14652"></a><span class="lineno">14652</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l14653"></a><span class="lineno">14653</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14654"></a><span class="lineno">14654</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14655"></a><span class="lineno">14655</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div>
+<div class="line"><a name="l14656"></a><span class="lineno">14656</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div>
+<div class="line"><a name="l14657"></a><span class="lineno">14657</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14658"></a><span class="lineno">14658</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14659"></a><span class="lineno">14659</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14660"></a><span class="lineno">14660</span>&#160;    {</div>
+<div class="line"><a name="l14661"></a><span class="lineno">14661</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14662"></a><span class="lineno">14662</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14663"></a><span class="lineno">14663</span>&#160;    }</div>
+<div class="line"><a name="l14664"></a><span class="lineno">14664</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14665"></a><span class="lineno">14665</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14666"></a><span class="lineno">14666</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l14667"></a><span class="lineno">14667</span>&#160;    {</div>
+<div class="line"><a name="l14668"></a><span class="lineno">14668</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14669"></a><span class="lineno">14669</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14670"></a><span class="lineno">14670</span>&#160;    }</div>
+<div class="line"><a name="l14671"></a><span class="lineno">14671</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14672"></a><span class="lineno">14672</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14673"></a><span class="lineno">14673</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l14674"></a><span class="lineno">14674</span>&#160;    {</div>
+<div class="line"><a name="l14675"></a><span class="lineno">14675</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14676"></a><span class="lineno">14676</span>&#160;    }</div>
+<div class="line"><a name="l14677"></a><span class="lineno">14677</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14678"></a><span class="lineno">14678</span>&#160;}</div>
+<div class="line"><a name="l14679"></a><span class="lineno">14679</span>&#160; </div>
+<div class="line"><a name="l14680"></a><span class="lineno">14680</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div>
+<div class="line"><a name="l14681"></a><span class="lineno">14681</span>&#160;{</div>
+<div class="line"><a name="l14682"></a><span class="lineno">14682</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14683"></a><span class="lineno">14683</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l14684"></a><span class="lineno">14684</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="l14685"></a><span class="lineno">14685</span>&#160;    <span class="keywordflow">return</span> VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);</div>
+<div class="line"><a name="l14686"></a><span class="lineno">14686</span>&#160;}</div>
+<div class="line"><a name="l14687"></a><span class="lineno">14687</span>&#160; </div>
+<div class="line"><a name="l14688"></a><span class="lineno">14688</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div>
+<div class="line"><a name="l14689"></a><span class="lineno">14689</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l14690"></a><span class="lineno">14690</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l14691"></a><span class="lineno">14691</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div>
+<div class="line"><a name="l14692"></a><span class="lineno">14692</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l14693"></a><span class="lineno">14693</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l14694"></a><span class="lineno">14694</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="l14695"></a><span class="lineno">14695</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l14696"></a><span class="lineno">14696</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l14697"></a><span class="lineno">14697</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l14698"></a><span class="lineno">14698</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14699"></a><span class="lineno">14699</span>&#160;{</div>
+<div class="line"><a name="l14700"></a><span class="lineno">14700</span>&#160;    VMA_ASSERT(pAllocations != VMA_NULL);</div>
+<div class="line"><a name="l14701"></a><span class="lineno">14701</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu&quot;</span>, memTypeIndex, allocationCount, size);</div>
+<div class="line"><a name="l14702"></a><span class="lineno">14702</span>&#160; </div>
+<div class="line"><a name="l14703"></a><span class="lineno">14703</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div>
+<div class="line"><a name="l14704"></a><span class="lineno">14704</span>&#160; </div>
+<div class="line"><a name="l14705"></a><span class="lineno">14705</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l14706"></a><span class="lineno">14706</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="l14707"></a><span class="lineno">14707</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l14708"></a><span class="lineno">14708</span>&#160;    {</div>
+<div class="line"><a name="l14709"></a><span class="lineno">14709</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="l14710"></a><span class="lineno">14710</span>&#160;    }</div>
+<div class="line"><a name="l14711"></a><span class="lineno">14711</span>&#160; </div>
+<div class="line"><a name="l14712"></a><span class="lineno">14712</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l14713"></a><span class="lineno">14713</span>&#160;    VMA_ASSERT(blockVector);</div>
+<div class="line"><a name="l14714"></a><span class="lineno">14714</span>&#160; </div>
+<div class="line"><a name="l14715"></a><span class="lineno">14715</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div>
+<div class="line"><a name="l14716"></a><span class="lineno">14716</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div>
+<div class="line"><a name="l14717"></a><span class="lineno">14717</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div>
+<div class="line"><a name="l14718"></a><span class="lineno">14718</span>&#160;        dedicatedAllocation ||</div>
+<div class="line"><a name="l14719"></a><span class="lineno">14719</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="l14720"></a><span class="lineno">14720</span>&#160;        size &gt; preferredBlockSize / 2;</div>
+<div class="line"><a name="l14721"></a><span class="lineno">14721</span>&#160; </div>
+<div class="line"><a name="l14722"></a><span class="lineno">14722</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div>
+<div class="line"><a name="l14723"></a><span class="lineno">14723</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="l14724"></a><span class="lineno">14724</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="l14725"></a><span class="lineno">14725</span>&#160;    {</div>
+<div class="line"><a name="l14726"></a><span class="lineno">14726</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="l14727"></a><span class="lineno">14727</span>&#160;    }</div>
+<div class="line"><a name="l14728"></a><span class="lineno">14728</span>&#160; </div>
+<div class="line"><a name="l14729"></a><span class="lineno">14729</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="l14730"></a><span class="lineno">14730</span>&#160;    {</div>
+<div class="line"><a name="l14731"></a><span class="lineno">14731</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="l14732"></a><span class="lineno">14732</span>&#160;        {</div>
+<div class="line"><a name="l14733"></a><span class="lineno">14733</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14734"></a><span class="lineno">14734</span>&#160;        }</div>
+<div class="line"><a name="l14735"></a><span class="lineno">14735</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14736"></a><span class="lineno">14736</span>&#160;        {</div>
+<div class="line"><a name="l14737"></a><span class="lineno">14737</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div>
+<div class="line"><a name="l14738"></a><span class="lineno">14738</span>&#160;                size,</div>
+<div class="line"><a name="l14739"></a><span class="lineno">14739</span>&#160;                suballocType,</div>
+<div class="line"><a name="l14740"></a><span class="lineno">14740</span>&#160;                memTypeIndex,</div>
+<div class="line"><a name="l14741"></a><span class="lineno">14741</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#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l14742"></a><span class="lineno">14742</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="l14743"></a><span class="lineno">14743</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="l14744"></a><span class="lineno">14744</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l14745"></a><span class="lineno">14745</span>&#160;                dedicatedBuffer,</div>
+<div class="line"><a name="l14746"></a><span class="lineno">14746</span>&#160;                dedicatedImage,</div>
+<div class="line"><a name="l14747"></a><span class="lineno">14747</span>&#160;                allocationCount,</div>
+<div class="line"><a name="l14748"></a><span class="lineno">14748</span>&#160;                pAllocations);</div>
+<div class="line"><a name="l14749"></a><span class="lineno">14749</span>&#160;        }</div>
+<div class="line"><a name="l14750"></a><span class="lineno">14750</span>&#160;    }</div>
+<div class="line"><a name="l14751"></a><span class="lineno">14751</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14752"></a><span class="lineno">14752</span>&#160;    {</div>
+<div class="line"><a name="l14753"></a><span class="lineno">14753</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div>
+<div class="line"><a name="l14754"></a><span class="lineno">14754</span>&#160;            m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l14755"></a><span class="lineno">14755</span>&#160;            size,</div>
+<div class="line"><a name="l14756"></a><span class="lineno">14756</span>&#160;            alignment,</div>
+<div class="line"><a name="l14757"></a><span class="lineno">14757</span>&#160;            finalCreateInfo,</div>
+<div class="line"><a name="l14758"></a><span class="lineno">14758</span>&#160;            suballocType,</div>
+<div class="line"><a name="l14759"></a><span class="lineno">14759</span>&#160;            allocationCount,</div>
+<div class="line"><a name="l14760"></a><span class="lineno">14760</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l14761"></a><span class="lineno">14761</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l14762"></a><span class="lineno">14762</span>&#160;        {</div>
+<div class="line"><a name="l14763"></a><span class="lineno">14763</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14764"></a><span class="lineno">14764</span>&#160;        }</div>
+<div class="line"><a name="l14765"></a><span class="lineno">14765</span>&#160; </div>
+<div class="line"><a name="l14766"></a><span class="lineno">14766</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div>
+<div class="line"><a name="l14767"></a><span class="lineno">14767</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="l14768"></a><span class="lineno">14768</span>&#160;        {</div>
+<div class="line"><a name="l14769"></a><span class="lineno">14769</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14770"></a><span class="lineno">14770</span>&#160;        }</div>
+<div class="line"><a name="l14771"></a><span class="lineno">14771</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14772"></a><span class="lineno">14772</span>&#160;        {</div>
+<div class="line"><a name="l14773"></a><span class="lineno">14773</span>&#160;            res = AllocateDedicatedMemory(</div>
+<div class="line"><a name="l14774"></a><span class="lineno">14774</span>&#160;                size,</div>
+<div class="line"><a name="l14775"></a><span class="lineno">14775</span>&#160;                suballocType,</div>
+<div class="line"><a name="l14776"></a><span class="lineno">14776</span>&#160;                memTypeIndex,</div>
+<div class="line"><a name="l14777"></a><span class="lineno">14777</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l14778"></a><span class="lineno">14778</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="l14779"></a><span class="lineno">14779</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="l14780"></a><span class="lineno">14780</span>&#160;                finalCreateInfo.pUserData,</div>
+<div class="line"><a name="l14781"></a><span class="lineno">14781</span>&#160;                dedicatedBuffer,</div>
+<div class="line"><a name="l14782"></a><span class="lineno">14782</span>&#160;                dedicatedImage,</div>
+<div class="line"><a name="l14783"></a><span class="lineno">14783</span>&#160;                allocationCount,</div>
+<div class="line"><a name="l14784"></a><span class="lineno">14784</span>&#160;                pAllocations);</div>
+<div class="line"><a name="l14785"></a><span class="lineno">14785</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l14786"></a><span class="lineno">14786</span>&#160;            {</div>
+<div class="line"><a name="l14787"></a><span class="lineno">14787</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div>
+<div class="line"><a name="l14788"></a><span class="lineno">14788</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div>
+<div class="line"><a name="l14789"></a><span class="lineno">14789</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14790"></a><span class="lineno">14790</span>&#160;            }</div>
+<div class="line"><a name="l14791"></a><span class="lineno">14791</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14792"></a><span class="lineno">14792</span>&#160;            {</div>
+<div class="line"><a name="l14793"></a><span class="lineno">14793</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div>
+<div class="line"><a name="l14794"></a><span class="lineno">14794</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l14795"></a><span class="lineno">14795</span>&#160;                <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14796"></a><span class="lineno">14796</span>&#160;            }</div>
+<div class="line"><a name="l14797"></a><span class="lineno">14797</span>&#160;        }</div>
+<div class="line"><a name="l14798"></a><span class="lineno">14798</span>&#160;    }</div>
+<div class="line"><a name="l14799"></a><span class="lineno">14799</span>&#160;}</div>
+<div class="line"><a name="l14800"></a><span class="lineno">14800</span>&#160; </div>
+<div class="line"><a name="l14801"></a><span class="lineno">14801</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div>
+<div class="line"><a name="l14802"></a><span class="lineno">14802</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l14803"></a><span class="lineno">14803</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l14804"></a><span class="lineno">14804</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l14805"></a><span class="lineno">14805</span>&#160;    <span class="keywordtype">bool</span> withinBudget,</div>
+<div class="line"><a name="l14806"></a><span class="lineno">14806</span>&#160;    <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l14807"></a><span class="lineno">14807</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l14808"></a><span class="lineno">14808</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l14809"></a><span class="lineno">14809</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l14810"></a><span class="lineno">14810</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l14811"></a><span class="lineno">14811</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l14812"></a><span class="lineno">14812</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14813"></a><span class="lineno">14813</span>&#160;{</div>
+<div class="line"><a name="l14814"></a><span class="lineno">14814</span>&#160;    VMA_ASSERT(allocationCount &gt; 0 &amp;&amp; pAllocations);</div>
+<div class="line"><a name="l14815"></a><span class="lineno">14815</span>&#160; </div>
+<div class="line"><a name="l14816"></a><span class="lineno">14816</span>&#160;    <span class="keywordflow">if</span>(withinBudget)</div>
+<div class="line"><a name="l14817"></a><span class="lineno">14817</span>&#160;    {</div>
+<div class="line"><a name="l14818"></a><span class="lineno">14818</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14819"></a><span class="lineno">14819</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l14820"></a><span class="lineno">14820</span>&#160;        GetBudget(&amp;heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l14821"></a><span class="lineno">14821</span>&#160;        <span class="keywordflow">if</span>(heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> + size * allocationCount &gt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>)</div>
+<div class="line"><a name="l14822"></a><span class="lineno">14822</span>&#160;        {</div>
+<div class="line"><a name="l14823"></a><span class="lineno">14823</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14824"></a><span class="lineno">14824</span>&#160;        }</div>
+<div class="line"><a name="l14825"></a><span class="lineno">14825</span>&#160;    }</div>
+<div class="line"><a name="l14826"></a><span class="lineno">14826</span>&#160; </div>
+<div class="line"><a name="l14827"></a><span class="lineno">14827</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l14828"></a><span class="lineno">14828</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l14829"></a><span class="lineno">14829</span>&#160;    allocInfo.allocationSize = size;</div>
+<div class="line"><a name="l14830"></a><span class="lineno">14830</span>&#160; </div>
+<div class="line"><a name="l14831"></a><span class="lineno">14831</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14832"></a><span class="lineno">14832</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div>
+<div class="line"><a name="l14833"></a><span class="lineno">14833</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14834"></a><span class="lineno">14834</span>&#160;    {</div>
+<div class="line"><a name="l14835"></a><span class="lineno">14835</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l14836"></a><span class="lineno">14836</span>&#160;        {</div>
+<div class="line"><a name="l14837"></a><span class="lineno">14837</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l14838"></a><span class="lineno">14838</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div>
+<div class="line"><a name="l14839"></a><span class="lineno">14839</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div>
+<div class="line"><a name="l14840"></a><span class="lineno">14840</span>&#160;        }</div>
+<div class="line"><a name="l14841"></a><span class="lineno">14841</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l14842"></a><span class="lineno">14842</span>&#160;        {</div>
+<div class="line"><a name="l14843"></a><span class="lineno">14843</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div>
+<div class="line"><a name="l14844"></a><span class="lineno">14844</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div>
+<div class="line"><a name="l14845"></a><span class="lineno">14845</span>&#160;        }</div>
+<div class="line"><a name="l14846"></a><span class="lineno">14846</span>&#160;    }</div>
+<div class="line"><a name="l14847"></a><span class="lineno">14847</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14848"></a><span class="lineno">14848</span>&#160; </div>
+<div class="line"><a name="l14849"></a><span class="lineno">14849</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l14850"></a><span class="lineno">14850</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l14851"></a><span class="lineno">14851</span>&#160;    <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l14852"></a><span class="lineno">14852</span>&#160;    {</div>
+<div class="line"><a name="l14853"></a><span class="lineno">14853</span>&#160;        res = AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l14854"></a><span class="lineno">14854</span>&#160;            size,</div>
+<div class="line"><a name="l14855"></a><span class="lineno">14855</span>&#160;            suballocType,</div>
+<div class="line"><a name="l14856"></a><span class="lineno">14856</span>&#160;            memTypeIndex,</div>
+<div class="line"><a name="l14857"></a><span class="lineno">14857</span>&#160;            allocInfo,</div>
+<div class="line"><a name="l14858"></a><span class="lineno">14858</span>&#160;            map,</div>
+<div class="line"><a name="l14859"></a><span class="lineno">14859</span>&#160;            isUserDataString,</div>
+<div class="line"><a name="l14860"></a><span class="lineno">14860</span>&#160;            pUserData,</div>
+<div class="line"><a name="l14861"></a><span class="lineno">14861</span>&#160;            pAllocations + allocIndex);</div>
+<div class="line"><a name="l14862"></a><span class="lineno">14862</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l14863"></a><span class="lineno">14863</span>&#160;        {</div>
+<div class="line"><a name="l14864"></a><span class="lineno">14864</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l14865"></a><span class="lineno">14865</span>&#160;        }</div>
+<div class="line"><a name="l14866"></a><span class="lineno">14866</span>&#160;    }</div>
+<div class="line"><a name="l14867"></a><span class="lineno">14867</span>&#160; </div>
+<div class="line"><a name="l14868"></a><span class="lineno">14868</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l14869"></a><span class="lineno">14869</span>&#160;    {</div>
+<div class="line"><a name="l14870"></a><span class="lineno">14870</span>&#160;        <span class="comment">// Register them in m_pDedicatedAllocations.</span></div>
+<div class="line"><a name="l14871"></a><span class="lineno">14871</span>&#160;        {</div>
+<div class="line"><a name="l14872"></a><span class="lineno">14872</span>&#160;            VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l14873"></a><span class="lineno">14873</span>&#160;            AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l14874"></a><span class="lineno">14874</span>&#160;            VMA_ASSERT(pDedicatedAllocations);</div>
+<div class="line"><a name="l14875"></a><span class="lineno">14875</span>&#160;            <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l14876"></a><span class="lineno">14876</span>&#160;            {</div>
+<div class="line"><a name="l14877"></a><span class="lineno">14877</span>&#160;                VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, pAllocations[allocIndex]);</div>
+<div class="line"><a name="l14878"></a><span class="lineno">14878</span>&#160;            }</div>
+<div class="line"><a name="l14879"></a><span class="lineno">14879</span>&#160;        }</div>
+<div class="line"><a name="l14880"></a><span class="lineno">14880</span>&#160; </div>
+<div class="line"><a name="l14881"></a><span class="lineno">14881</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u&quot;</span>, allocationCount, memTypeIndex);</div>
+<div class="line"><a name="l14882"></a><span class="lineno">14882</span>&#160;    }</div>
+<div class="line"><a name="l14883"></a><span class="lineno">14883</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14884"></a><span class="lineno">14884</span>&#160;    {</div>
+<div class="line"><a name="l14885"></a><span class="lineno">14885</span>&#160;        <span class="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l14886"></a><span class="lineno">14886</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l14887"></a><span class="lineno">14887</span>&#160;        {</div>
+<div class="line"><a name="l14888"></a><span class="lineno">14888</span>&#160;            <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l14889"></a><span class="lineno">14889</span>&#160;            VkDeviceMemory hMemory = currAlloc-&gt;GetMemory();</div>
+<div class="line"><a name="l14890"></a><span class="lineno">14890</span>&#160;    </div>
+<div class="line"><a name="l14891"></a><span class="lineno">14891</span>&#160;            <span class="comment">/*</span></div>
+<div class="line"><a name="l14892"></a><span class="lineno">14892</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="l14893"></a><span class="lineno">14893</span>&#160;<span class="comment">            before vkFreeMemory.</span></div>
+<div class="line"><a name="l14894"></a><span class="lineno">14894</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l14895"></a><span class="lineno">14895</span>&#160;<span class="comment">            if(currAlloc-&gt;GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l14896"></a><span class="lineno">14896</span>&#160;<span class="comment">            {</span></div>
+<div class="line"><a name="l14897"></a><span class="lineno">14897</span>&#160;<span class="comment">                (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l14898"></a><span class="lineno">14898</span>&#160;<span class="comment">            }</span></div>
+<div class="line"><a name="l14899"></a><span class="lineno">14899</span>&#160;<span class="comment">            */</span></div>
+<div class="line"><a name="l14900"></a><span class="lineno">14900</span>&#160;    </div>
+<div class="line"><a name="l14901"></a><span class="lineno">14901</span>&#160;            FreeVulkanMemory(memTypeIndex, currAlloc-&gt;GetSize(), hMemory);</div>
+<div class="line"><a name="l14902"></a><span class="lineno">14902</span>&#160;            <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14903"></a><span class="lineno">14903</span>&#160;            m_Budget.m_AllocationBytes[heapIndex] -= currAlloc-&gt;GetSize();</div>
+<div class="line"><a name="l14904"></a><span class="lineno">14904</span>&#160;            ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l14905"></a><span class="lineno">14905</span>&#160;            currAlloc-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l14906"></a><span class="lineno">14906</span>&#160;            currAlloc-&gt;Dtor();</div>
+<div class="line"><a name="l14907"></a><span class="lineno">14907</span>&#160;            m_AllocationObjectAllocator.Free(currAlloc);</div>
+<div class="line"><a name="l14908"></a><span class="lineno">14908</span>&#160;        }</div>
+<div class="line"><a name="l14909"></a><span class="lineno">14909</span>&#160; </div>
+<div class="line"><a name="l14910"></a><span class="lineno">14910</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
+<div class="line"><a name="l14911"></a><span class="lineno">14911</span>&#160;    }</div>
+<div class="line"><a name="l14912"></a><span class="lineno">14912</span>&#160; </div>
+<div class="line"><a name="l14913"></a><span class="lineno">14913</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14914"></a><span class="lineno">14914</span>&#160;}</div>
+<div class="line"><a name="l14915"></a><span class="lineno">14915</span>&#160; </div>
+<div class="line"><a name="l14916"></a><span class="lineno">14916</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l14917"></a><span class="lineno">14917</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l14918"></a><span class="lineno">14918</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l14919"></a><span class="lineno">14919</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l14920"></a><span class="lineno">14920</span>&#160;    <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
+<div class="line"><a name="l14921"></a><span class="lineno">14921</span>&#160;    <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l14922"></a><span class="lineno">14922</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l14923"></a><span class="lineno">14923</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l14924"></a><span class="lineno">14924</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l14925"></a><span class="lineno">14925</span>&#160;{</div>
+<div class="line"><a name="l14926"></a><span class="lineno">14926</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l14927"></a><span class="lineno">14927</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div>
+<div class="line"><a name="l14928"></a><span class="lineno">14928</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l14929"></a><span class="lineno">14929</span>&#160;    {</div>
+<div class="line"><a name="l14930"></a><span class="lineno">14930</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l14931"></a><span class="lineno">14931</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14932"></a><span class="lineno">14932</span>&#160;    }</div>
+<div class="line"><a name="l14933"></a><span class="lineno">14933</span>&#160; </div>
+<div class="line"><a name="l14934"></a><span class="lineno">14934</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l14935"></a><span class="lineno">14935</span>&#160;    <span class="keywordflow">if</span>(map)</div>
+<div class="line"><a name="l14936"></a><span class="lineno">14936</span>&#160;    {</div>
+<div class="line"><a name="l14937"></a><span class="lineno">14937</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div>
+<div class="line"><a name="l14938"></a><span class="lineno">14938</span>&#160;            m_hDevice,</div>
+<div class="line"><a name="l14939"></a><span class="lineno">14939</span>&#160;            hMemory,</div>
+<div class="line"><a name="l14940"></a><span class="lineno">14940</span>&#160;            0,</div>
+<div class="line"><a name="l14941"></a><span class="lineno">14941</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l14942"></a><span class="lineno">14942</span>&#160;            0,</div>
+<div class="line"><a name="l14943"></a><span class="lineno">14943</span>&#160;            &amp;pMappedData);</div>
+<div class="line"><a name="l14944"></a><span class="lineno">14944</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l14945"></a><span class="lineno">14945</span>&#160;        {</div>
+<div class="line"><a name="l14946"></a><span class="lineno">14946</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l14947"></a><span class="lineno">14947</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div>
+<div class="line"><a name="l14948"></a><span class="lineno">14948</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14949"></a><span class="lineno">14949</span>&#160;        }</div>
+<div class="line"><a name="l14950"></a><span class="lineno">14950</span>&#160;    }</div>
+<div class="line"><a name="l14951"></a><span class="lineno">14951</span>&#160; </div>
+<div class="line"><a name="l14952"></a><span class="lineno">14952</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l14953"></a><span class="lineno">14953</span>&#160;    (*pAllocation)-&gt;Ctor(m_CurrentFrameIndex.load(), isUserDataString);</div>
+<div class="line"><a name="l14954"></a><span class="lineno">14954</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div>
+<div class="line"><a name="l14955"></a><span class="lineno">14955</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div>
+<div class="line"><a name="l14956"></a><span class="lineno">14956</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14957"></a><span class="lineno">14957</span>&#160;    m_Budget.m_AllocationBytes[heapIndex] += size;</div>
+<div class="line"><a name="l14958"></a><span class="lineno">14958</span>&#160;    ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l14959"></a><span class="lineno">14959</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l14960"></a><span class="lineno">14960</span>&#160;    {</div>
+<div class="line"><a name="l14961"></a><span class="lineno">14961</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l14962"></a><span class="lineno">14962</span>&#160;    }</div>
+<div class="line"><a name="l14963"></a><span class="lineno">14963</span>&#160; </div>
+<div class="line"><a name="l14964"></a><span class="lineno">14964</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14965"></a><span class="lineno">14965</span>&#160;}</div>
+<div class="line"><a name="l14966"></a><span class="lineno">14966</span>&#160; </div>
+<div class="line"><a name="l14967"></a><span class="lineno">14967</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div>
+<div class="line"><a name="l14968"></a><span class="lineno">14968</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l14969"></a><span class="lineno">14969</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l14970"></a><span class="lineno">14970</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l14971"></a><span class="lineno">14971</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l14972"></a><span class="lineno">14972</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l14973"></a><span class="lineno">14973</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14974"></a><span class="lineno">14974</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14975"></a><span class="lineno">14975</span>&#160;    {</div>
+<div class="line"><a name="l14976"></a><span class="lineno">14976</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l14977"></a><span class="lineno">14977</span>&#160;        memReqInfo.buffer = hBuffer;</div>
+<div class="line"><a name="l14978"></a><span class="lineno">14978</span>&#160; </div>
+<div class="line"><a name="l14979"></a><span class="lineno">14979</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
+<div class="line"><a name="l14980"></a><span class="lineno">14980</span>&#160; </div>
+<div class="line"><a name="l14981"></a><span class="lineno">14981</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l14982"></a><span class="lineno">14982</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div>
+<div class="line"><a name="l14983"></a><span class="lineno">14983</span>&#160; </div>
+<div class="line"><a name="l14984"></a><span class="lineno">14984</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
+<div class="line"><a name="l14985"></a><span class="lineno">14985</span>&#160; </div>
+<div class="line"><a name="l14986"></a><span class="lineno">14986</span>&#160;        memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l14987"></a><span class="lineno">14987</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l14988"></a><span class="lineno">14988</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
+<div class="line"><a name="l14989"></a><span class="lineno">14989</span>&#160;    }</div>
+<div class="line"><a name="l14990"></a><span class="lineno">14990</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14991"></a><span class="lineno">14991</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14992"></a><span class="lineno">14992</span>&#160;    {</div>
+<div class="line"><a name="l14993"></a><span class="lineno">14993</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div>
+<div class="line"><a name="l14994"></a><span class="lineno">14994</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14995"></a><span class="lineno">14995</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14996"></a><span class="lineno">14996</span>&#160;    }</div>
+<div class="line"><a name="l14997"></a><span class="lineno">14997</span>&#160;}</div>
+<div class="line"><a name="l14998"></a><span class="lineno">14998</span>&#160; </div>
+<div class="line"><a name="l14999"></a><span class="lineno">14999</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div>
+<div class="line"><a name="l15000"></a><span class="lineno">15000</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l15001"></a><span class="lineno">15001</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l15002"></a><span class="lineno">15002</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15003"></a><span class="lineno">15003</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l15004"></a><span class="lineno">15004</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l15005"></a><span class="lineno">15005</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l15006"></a><span class="lineno">15006</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l15007"></a><span class="lineno">15007</span>&#160;    {</div>
+<div class="line"><a name="l15008"></a><span class="lineno">15008</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l15009"></a><span class="lineno">15009</span>&#160;        memReqInfo.image = hImage;</div>
+<div class="line"><a name="l15010"></a><span class="lineno">15010</span>&#160; </div>
+<div class="line"><a name="l15011"></a><span class="lineno">15011</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
+<div class="line"><a name="l15012"></a><span class="lineno">15012</span>&#160; </div>
+<div class="line"><a name="l15013"></a><span class="lineno">15013</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l15014"></a><span class="lineno">15014</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div>
+<div class="line"><a name="l15015"></a><span class="lineno">15015</span>&#160; </div>
+<div class="line"><a name="l15016"></a><span class="lineno">15016</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
+<div class="line"><a name="l15017"></a><span class="lineno">15017</span>&#160; </div>
+<div class="line"><a name="l15018"></a><span class="lineno">15018</span>&#160;        memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l15019"></a><span class="lineno">15019</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l15020"></a><span class="lineno">15020</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
+<div class="line"><a name="l15021"></a><span class="lineno">15021</span>&#160;    }</div>
+<div class="line"><a name="l15022"></a><span class="lineno">15022</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15023"></a><span class="lineno">15023</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l15024"></a><span class="lineno">15024</span>&#160;    {</div>
+<div class="line"><a name="l15025"></a><span class="lineno">15025</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div>
+<div class="line"><a name="l15026"></a><span class="lineno">15026</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15027"></a><span class="lineno">15027</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15028"></a><span class="lineno">15028</span>&#160;    }</div>
+<div class="line"><a name="l15029"></a><span class="lineno">15029</span>&#160;}</div>
+<div class="line"><a name="l15030"></a><span class="lineno">15030</span>&#160; </div>
+<div class="line"><a name="l15031"></a><span class="lineno">15031</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div>
+<div class="line"><a name="l15032"></a><span class="lineno">15032</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l15033"></a><span class="lineno">15033</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15034"></a><span class="lineno">15034</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15035"></a><span class="lineno">15035</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l15036"></a><span class="lineno">15036</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l15037"></a><span class="lineno">15037</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="l15038"></a><span class="lineno">15038</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l15039"></a><span class="lineno">15039</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l15040"></a><span class="lineno">15040</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15041"></a><span class="lineno">15041</span>&#160;{</div>
+<div class="line"><a name="l15042"></a><span class="lineno">15042</span>&#160;    memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
+<div class="line"><a name="l15043"></a><span class="lineno">15043</span>&#160; </div>
+<div class="line"><a name="l15044"></a><span class="lineno">15044</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div>
+<div class="line"><a name="l15045"></a><span class="lineno">15045</span>&#160; </div>
+<div class="line"><a name="l15046"></a><span class="lineno">15046</span>&#160;    <span class="keywordflow">if</span>(vkMemReq.size == 0)</div>
+<div class="line"><a name="l15047"></a><span class="lineno">15047</span>&#160;    {</div>
+<div class="line"><a name="l15048"></a><span class="lineno">15048</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l15049"></a><span class="lineno">15049</span>&#160;    }</div>
+<div class="line"><a name="l15050"></a><span class="lineno">15050</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="l15051"></a><span class="lineno">15051</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="l15052"></a><span class="lineno">15052</span>&#160;    {</div>
+<div class="line"><a name="l15053"></a><span class="lineno">15053</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="l15054"></a><span class="lineno">15054</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15055"></a><span class="lineno">15055</span>&#160;    }</div>
+<div class="line"><a name="l15056"></a><span class="lineno">15056</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="l15057"></a><span class="lineno">15057</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="l15058"></a><span class="lineno">15058</span>&#160;    {</div>
+<div class="line"><a name="l15059"></a><span class="lineno">15059</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="l15060"></a><span class="lineno">15060</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15061"></a><span class="lineno">15061</span>&#160;    }</div>
+<div class="line"><a name="l15062"></a><span class="lineno">15062</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div>
+<div class="line"><a name="l15063"></a><span class="lineno">15063</span>&#160;    {</div>
+<div class="line"><a name="l15064"></a><span class="lineno">15064</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="l15065"></a><span class="lineno">15065</span>&#160;        {</div>
+<div class="line"><a name="l15066"></a><span class="lineno">15066</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="l15067"></a><span class="lineno">15067</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15068"></a><span class="lineno">15068</span>&#160;        }</div>
+<div class="line"><a name="l15069"></a><span class="lineno">15069</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="l15070"></a><span class="lineno">15070</span>&#160;        {</div>
+<div class="line"><a name="l15071"></a><span class="lineno">15071</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="l15072"></a><span class="lineno">15072</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15073"></a><span class="lineno">15073</span>&#160;        }</div>
+<div class="line"><a name="l15074"></a><span class="lineno">15074</span>&#160;    }</div>
+<div class="line"><a name="l15075"></a><span class="lineno">15075</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="l15076"></a><span class="lineno">15076</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="l15077"></a><span class="lineno">15077</span>&#160;    {</div>
+<div class="line"><a name="l15078"></a><span class="lineno">15078</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="l15079"></a><span class="lineno">15079</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15080"></a><span class="lineno">15080</span>&#160;    }</div>
+<div class="line"><a name="l15081"></a><span class="lineno">15081</span>&#160; </div>
+<div class="line"><a name="l15082"></a><span class="lineno">15082</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="l15083"></a><span class="lineno">15083</span>&#160;    {</div>
+<div class="line"><a name="l15084"></a><span class="lineno">15084</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div>
+<div class="line"><a name="l15085"></a><span class="lineno">15085</span>&#160;            vkMemReq.alignment,</div>
+<div class="line"><a name="l15086"></a><span class="lineno">15086</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="l15087"></a><span class="lineno">15087</span>&#160; </div>
+<div class="line"><a name="l15088"></a><span class="lineno">15088</span>&#160;        <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div>
+<div class="line"><a name="l15089"></a><span class="lineno">15089</span>&#160;        <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l15090"></a><span class="lineno">15090</span>&#160;        <span class="keywordflow">if</span>((createInfoForPool.<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="l15091"></a><span class="lineno">15091</span>&#160;            (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l15092"></a><span class="lineno">15092</span>&#160;        {</div>
+<div class="line"><a name="l15093"></a><span class="lineno">15093</span>&#160;            createInfoForPool.<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="l15094"></a><span class="lineno">15094</span>&#160;        }</div>
+<div class="line"><a name="l15095"></a><span class="lineno">15095</span>&#160; </div>
+<div class="line"><a name="l15096"></a><span class="lineno">15096</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="l15097"></a><span class="lineno">15097</span>&#160;            m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l15098"></a><span class="lineno">15098</span>&#160;            vkMemReq.size,</div>
+<div class="line"><a name="l15099"></a><span class="lineno">15099</span>&#160;            alignmentForPool,</div>
+<div class="line"><a name="l15100"></a><span class="lineno">15100</span>&#160;            createInfoForPool,</div>
+<div class="line"><a name="l15101"></a><span class="lineno">15101</span>&#160;            suballocType,</div>
+<div class="line"><a name="l15102"></a><span class="lineno">15102</span>&#160;            allocationCount,</div>
+<div class="line"><a name="l15103"></a><span class="lineno">15103</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l15104"></a><span class="lineno">15104</span>&#160;    }</div>
+<div class="line"><a name="l15105"></a><span class="lineno">15105</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15106"></a><span class="lineno">15106</span>&#160;    {</div>
+<div class="line"><a name="l15107"></a><span class="lineno">15107</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div>
+<div class="line"><a name="l15108"></a><span class="lineno">15108</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div>
+<div class="line"><a name="l15109"></a><span class="lineno">15109</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l15110"></a><span class="lineno">15110</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
+<div class="line"><a name="l15111"></a><span class="lineno">15111</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15112"></a><span class="lineno">15112</span>&#160;        {</div>
+<div class="line"><a name="l15113"></a><span class="lineno">15113</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l15114"></a><span class="lineno">15114</span>&#160;                vkMemReq.alignment,</div>
+<div class="line"><a name="l15115"></a><span class="lineno">15115</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div>
+<div class="line"><a name="l15116"></a><span class="lineno">15116</span>&#160; </div>
+<div class="line"><a name="l15117"></a><span class="lineno">15117</span>&#160;            res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l15118"></a><span class="lineno">15118</span>&#160;                vkMemReq.size,</div>
+<div class="line"><a name="l15119"></a><span class="lineno">15119</span>&#160;                alignmentForMemType,</div>
+<div class="line"><a name="l15120"></a><span class="lineno">15120</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15121"></a><span class="lineno">15121</span>&#160;                dedicatedBuffer,</div>
+<div class="line"><a name="l15122"></a><span class="lineno">15122</span>&#160;                dedicatedImage,</div>
+<div class="line"><a name="l15123"></a><span class="lineno">15123</span>&#160;                createInfo,</div>
+<div class="line"><a name="l15124"></a><span class="lineno">15124</span>&#160;                memTypeIndex,</div>
+<div class="line"><a name="l15125"></a><span class="lineno">15125</span>&#160;                suballocType,</div>
+<div class="line"><a name="l15126"></a><span class="lineno">15126</span>&#160;                allocationCount,</div>
+<div class="line"><a name="l15127"></a><span class="lineno">15127</span>&#160;                pAllocations);</div>
+<div class="line"><a name="l15128"></a><span class="lineno">15128</span>&#160;            <span class="comment">// Succeeded on first try.</span></div>
+<div class="line"><a name="l15129"></a><span class="lineno">15129</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15130"></a><span class="lineno">15130</span>&#160;            {</div>
+<div class="line"><a name="l15131"></a><span class="lineno">15131</span>&#160;                <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15132"></a><span class="lineno">15132</span>&#160;            }</div>
+<div class="line"><a name="l15133"></a><span class="lineno">15133</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div>
+<div class="line"><a name="l15134"></a><span class="lineno">15134</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15135"></a><span class="lineno">15135</span>&#160;            {</div>
+<div class="line"><a name="l15136"></a><span class="lineno">15136</span>&#160;                <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15137"></a><span class="lineno">15137</span>&#160;                {</div>
+<div class="line"><a name="l15138"></a><span class="lineno">15138</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div>
+<div class="line"><a name="l15139"></a><span class="lineno">15139</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div>
+<div class="line"><a name="l15140"></a><span class="lineno">15140</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div>
+<div class="line"><a name="l15141"></a><span class="lineno">15141</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
+<div class="line"><a name="l15142"></a><span class="lineno">15142</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15143"></a><span class="lineno">15143</span>&#160;                    {</div>
+<div class="line"><a name="l15144"></a><span class="lineno">15144</span>&#160;                        alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l15145"></a><span class="lineno">15145</span>&#160;                            vkMemReq.alignment,</div>
+<div class="line"><a name="l15146"></a><span class="lineno">15146</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div>
+<div class="line"><a name="l15147"></a><span class="lineno">15147</span>&#160;                        </div>
+<div class="line"><a name="l15148"></a><span class="lineno">15148</span>&#160;                        res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l15149"></a><span class="lineno">15149</span>&#160;                            vkMemReq.size,</div>
+<div class="line"><a name="l15150"></a><span class="lineno">15150</span>&#160;                            alignmentForMemType,</div>
+<div class="line"><a name="l15151"></a><span class="lineno">15151</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15152"></a><span class="lineno">15152</span>&#160;                            dedicatedBuffer,</div>
+<div class="line"><a name="l15153"></a><span class="lineno">15153</span>&#160;                            dedicatedImage,</div>
+<div class="line"><a name="l15154"></a><span class="lineno">15154</span>&#160;                            createInfo,</div>
+<div class="line"><a name="l15155"></a><span class="lineno">15155</span>&#160;                            memTypeIndex,</div>
+<div class="line"><a name="l15156"></a><span class="lineno">15156</span>&#160;                            suballocType,</div>
+<div class="line"><a name="l15157"></a><span class="lineno">15157</span>&#160;                            allocationCount,</div>
+<div class="line"><a name="l15158"></a><span class="lineno">15158</span>&#160;                            pAllocations);</div>
+<div class="line"><a name="l15159"></a><span class="lineno">15159</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div>
+<div class="line"><a name="l15160"></a><span class="lineno">15160</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15161"></a><span class="lineno">15161</span>&#160;                        {</div>
+<div class="line"><a name="l15162"></a><span class="lineno">15162</span>&#160;                            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15163"></a><span class="lineno">15163</span>&#160;                        }</div>
+<div class="line"><a name="l15164"></a><span class="lineno">15164</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="l15165"></a><span class="lineno">15165</span>&#160;                    }</div>
+<div class="line"><a name="l15166"></a><span class="lineno">15166</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div>
+<div class="line"><a name="l15167"></a><span class="lineno">15167</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15168"></a><span class="lineno">15168</span>&#160;                    {</div>
+<div class="line"><a name="l15169"></a><span class="lineno">15169</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="l15170"></a><span class="lineno">15170</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15171"></a><span class="lineno">15171</span>&#160;                    }</div>
+<div class="line"><a name="l15172"></a><span class="lineno">15172</span>&#160;                }</div>
+<div class="line"><a name="l15173"></a><span class="lineno">15173</span>&#160;            }</div>
+<div class="line"><a name="l15174"></a><span class="lineno">15174</span>&#160;        }</div>
+<div class="line"><a name="l15175"></a><span class="lineno">15175</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="l15176"></a><span class="lineno">15176</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15177"></a><span class="lineno">15177</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15178"></a><span class="lineno">15178</span>&#160;    }</div>
+<div class="line"><a name="l15179"></a><span class="lineno">15179</span>&#160;}</div>
+<div class="line"><a name="l15180"></a><span class="lineno">15180</span>&#160; </div>
+<div class="line"><a name="l15181"></a><span class="lineno">15181</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div>
+<div class="line"><a name="l15182"></a><span class="lineno">15182</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l15183"></a><span class="lineno">15183</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15184"></a><span class="lineno">15184</span>&#160;{</div>
+<div class="line"><a name="l15185"></a><span class="lineno">15185</span>&#160;    VMA_ASSERT(pAllocations);</div>
+<div class="line"><a name="l15186"></a><span class="lineno">15186</span>&#160; </div>
+<div class="line"><a name="l15187"></a><span class="lineno">15187</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div>
+<div class="line"><a name="l15188"></a><span class="lineno">15188</span>&#160;    {</div>
+<div class="line"><a name="l15189"></a><span class="lineno">15189</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div>
+<div class="line"><a name="l15190"></a><span class="lineno">15190</span>&#160; </div>
+<div class="line"><a name="l15191"></a><span class="lineno">15191</span>&#160;        <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15192"></a><span class="lineno">15192</span>&#160;        {</div>
+<div class="line"><a name="l15193"></a><span class="lineno">15193</span>&#160;            <span class="keywordflow">if</span>(TouchAllocation(allocation))</div>
+<div class="line"><a name="l15194"></a><span class="lineno">15194</span>&#160;            {</div>
+<div class="line"><a name="l15195"></a><span class="lineno">15195</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l15196"></a><span class="lineno">15196</span>&#160;                {</div>
+<div class="line"><a name="l15197"></a><span class="lineno">15197</span>&#160;                    FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div>
+<div class="line"><a name="l15198"></a><span class="lineno">15198</span>&#160;                }</div>
+<div class="line"><a name="l15199"></a><span class="lineno">15199</span>&#160; </div>
+<div class="line"><a name="l15200"></a><span class="lineno">15200</span>&#160;                <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div>
+<div class="line"><a name="l15201"></a><span class="lineno">15201</span>&#160;                {</div>
+<div class="line"><a name="l15202"></a><span class="lineno">15202</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15203"></a><span class="lineno">15203</span>&#160;                    {</div>
+<div class="line"><a name="l15204"></a><span class="lineno">15204</span>&#160;                        VmaBlockVector* pBlockVector = VMA_NULL;</div>
+<div class="line"><a name="l15205"></a><span class="lineno">15205</span>&#160;                        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetBlock()-&gt;GetParentPool();</div>
+<div class="line"><a name="l15206"></a><span class="lineno">15206</span>&#160;                        <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15207"></a><span class="lineno">15207</span>&#160;                        {</div>
+<div class="line"><a name="l15208"></a><span class="lineno">15208</span>&#160;                            pBlockVector = &amp;hPool-&gt;m_BlockVector;</div>
+<div class="line"><a name="l15209"></a><span class="lineno">15209</span>&#160;                        }</div>
+<div class="line"><a name="l15210"></a><span class="lineno">15210</span>&#160;                        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15211"></a><span class="lineno">15211</span>&#160;                        {</div>
+<div class="line"><a name="l15212"></a><span class="lineno">15212</span>&#160;                            <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15213"></a><span class="lineno">15213</span>&#160;                            pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15214"></a><span class="lineno">15214</span>&#160;                        }</div>
+<div class="line"><a name="l15215"></a><span class="lineno">15215</span>&#160;                        pBlockVector-&gt;Free(allocation);</div>
+<div class="line"><a name="l15216"></a><span class="lineno">15216</span>&#160;                    }</div>
+<div class="line"><a name="l15217"></a><span class="lineno">15217</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15218"></a><span class="lineno">15218</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15219"></a><span class="lineno">15219</span>&#160;                    FreeDedicatedMemory(allocation);</div>
+<div class="line"><a name="l15220"></a><span class="lineno">15220</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15221"></a><span class="lineno">15221</span>&#160;                <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15222"></a><span class="lineno">15222</span>&#160;                    VMA_ASSERT(0);</div>
+<div class="line"><a name="l15223"></a><span class="lineno">15223</span>&#160;                }</div>
+<div class="line"><a name="l15224"></a><span class="lineno">15224</span>&#160;            }</div>
+<div class="line"><a name="l15225"></a><span class="lineno">15225</span>&#160; </div>
+<div class="line"><a name="l15226"></a><span class="lineno">15226</span>&#160;            m_Budget.m_AllocationBytes[MemoryTypeIndexToHeapIndex(allocation-&gt;GetMemoryTypeIndex())] -= allocation-&gt;GetSize();</div>
+<div class="line"><a name="l15227"></a><span class="lineno">15227</span>&#160;            ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l15228"></a><span class="lineno">15228</span>&#160;            allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l15229"></a><span class="lineno">15229</span>&#160;            allocation-&gt;Dtor();</div>
+<div class="line"><a name="l15230"></a><span class="lineno">15230</span>&#160;            m_AllocationObjectAllocator.Free(allocation);</div>
+<div class="line"><a name="l15231"></a><span class="lineno">15231</span>&#160;        }</div>
+<div class="line"><a name="l15232"></a><span class="lineno">15232</span>&#160;    }</div>
+<div class="line"><a name="l15233"></a><span class="lineno">15233</span>&#160;}</div>
+<div class="line"><a name="l15234"></a><span class="lineno">15234</span>&#160; </div>
+<div class="line"><a name="l15235"></a><span class="lineno">15235</span>&#160;VkResult VmaAllocator_T::ResizeAllocation(</div>
+<div class="line"><a name="l15236"></a><span class="lineno">15236</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
+<div class="line"><a name="l15237"></a><span class="lineno">15237</span>&#160;    VkDeviceSize newSize)</div>
+<div class="line"><a name="l15238"></a><span class="lineno">15238</span>&#160;{</div>
+<div class="line"><a name="l15239"></a><span class="lineno">15239</span>&#160;    <span class="comment">// This function is deprecated and so it does nothing. It&#39;s left for backward compatibility.</span></div>
+<div class="line"><a name="l15240"></a><span class="lineno">15240</span>&#160;    <span class="keywordflow">if</span>(newSize == 0 || alloc-&gt;GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15241"></a><span class="lineno">15241</span>&#160;    {</div>
+<div class="line"><a name="l15242"></a><span class="lineno">15242</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l15243"></a><span class="lineno">15243</span>&#160;    }</div>
+<div class="line"><a name="l15244"></a><span class="lineno">15244</span>&#160;    <span class="keywordflow">if</span>(newSize == alloc-&gt;GetSize())</div>
+<div class="line"><a name="l15245"></a><span class="lineno">15245</span>&#160;    {</div>
+<div class="line"><a name="l15246"></a><span class="lineno">15246</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15247"></a><span class="lineno">15247</span>&#160;    }</div>
+<div class="line"><a name="l15248"></a><span class="lineno">15248</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div>
+<div class="line"><a name="l15249"></a><span class="lineno">15249</span>&#160;}</div>
+<div class="line"><a name="l15250"></a><span class="lineno">15250</span>&#160; </div>
+<div class="line"><a name="l15251"></a><span class="lineno">15251</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="l15252"></a><span class="lineno">15252</span>&#160;{</div>
+<div class="line"><a name="l15253"></a><span class="lineno">15253</span>&#160;    <span class="comment">// Initialize.</span></div>
+<div class="line"><a name="l15254"></a><span class="lineno">15254</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l15255"></a><span class="lineno">15255</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="l15256"></a><span class="lineno">15256</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l15257"></a><span class="lineno">15257</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="l15258"></a><span class="lineno">15258</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l15259"></a><span class="lineno">15259</span>&#160;    </div>
+<div class="line"><a name="l15260"></a><span class="lineno">15260</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15261"></a><span class="lineno">15261</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15262"></a><span class="lineno">15262</span>&#160;    {</div>
+<div class="line"><a name="l15263"></a><span class="lineno">15263</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15264"></a><span class="lineno">15264</span>&#160;        VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l15265"></a><span class="lineno">15265</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div>
+<div class="line"><a name="l15266"></a><span class="lineno">15266</span>&#160;    }</div>
+<div class="line"><a name="l15267"></a><span class="lineno">15267</span>&#160; </div>
+<div class="line"><a name="l15268"></a><span class="lineno">15268</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15269"></a><span class="lineno">15269</span>&#160;    {</div>
+<div class="line"><a name="l15270"></a><span class="lineno">15270</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15271"></a><span class="lineno">15271</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="l15272"></a><span class="lineno">15272</span>&#160;        {</div>
+<div class="line"><a name="l15273"></a><span class="lineno">15273</span>&#160;            m_Pools[poolIndex]-&gt;m_BlockVector.AddStats(pStats);</div>
+<div class="line"><a name="l15274"></a><span class="lineno">15274</span>&#160;        }</div>
+<div class="line"><a name="l15275"></a><span class="lineno">15275</span>&#160;    }</div>
+<div class="line"><a name="l15276"></a><span class="lineno">15276</span>&#160; </div>
+<div class="line"><a name="l15277"></a><span class="lineno">15277</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div>
+<div class="line"><a name="l15278"></a><span class="lineno">15278</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15279"></a><span class="lineno">15279</span>&#160;    {</div>
+<div class="line"><a name="l15280"></a><span class="lineno">15280</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l15281"></a><span class="lineno">15281</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l15282"></a><span class="lineno">15282</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l15283"></a><span class="lineno">15283</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div>
+<div class="line"><a name="l15284"></a><span class="lineno">15284</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="l15285"></a><span class="lineno">15285</span>&#160;        {</div>
+<div class="line"><a name="l15286"></a><span class="lineno">15286</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l15287"></a><span class="lineno">15287</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div>
+<div class="line"><a name="l15288"></a><span class="lineno">15288</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l15289"></a><span class="lineno">15289</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l15290"></a><span class="lineno">15290</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
+<div class="line"><a name="l15291"></a><span class="lineno">15291</span>&#160;        }</div>
+<div class="line"><a name="l15292"></a><span class="lineno">15292</span>&#160;    }</div>
+<div class="line"><a name="l15293"></a><span class="lineno">15293</span>&#160; </div>
+<div class="line"><a name="l15294"></a><span class="lineno">15294</span>&#160;    <span class="comment">// Postprocess.</span></div>
+<div class="line"><a name="l15295"></a><span class="lineno">15295</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l15296"></a><span class="lineno">15296</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="l15297"></a><span class="lineno">15297</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l15298"></a><span class="lineno">15298</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="l15299"></a><span class="lineno">15299</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l15300"></a><span class="lineno">15300</span>&#160;}</div>
+<div class="line"><a name="l15301"></a><span class="lineno">15301</span>&#160; </div>
+<div class="line"><a name="l15302"></a><span class="lineno">15302</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBudget(<a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount)</div>
+<div class="line"><a name="l15303"></a><span class="lineno">15303</span>&#160;{</div>
+<div class="line"><a name="l15304"></a><span class="lineno">15304</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15305"></a><span class="lineno">15305</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l15306"></a><span class="lineno">15306</span>&#160;    {</div>
+<div class="line"><a name="l15307"></a><span class="lineno">15307</span>&#160;        <span class="keywordflow">if</span>(m_Budget.m_OperationsSinceBudgetFetch &lt; 30)</div>
+<div class="line"><a name="l15308"></a><span class="lineno">15308</span>&#160;        {</div>
+<div class="line"><a name="l15309"></a><span class="lineno">15309</span>&#160;            VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l15310"></a><span class="lineno">15310</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l15311"></a><span class="lineno">15311</span>&#160;            {</div>
+<div class="line"><a name="l15312"></a><span class="lineno">15312</span>&#160;                <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l15313"></a><span class="lineno">15313</span>&#160; </div>
+<div class="line"><a name="l15314"></a><span class="lineno">15314</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15315"></a><span class="lineno">15315</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
+<div class="line"><a name="l15316"></a><span class="lineno">15316</span>&#160; </div>
+<div class="line"><a name="l15317"></a><span class="lineno">15317</span>&#160;                <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] + outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> &gt; m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])</div>
+<div class="line"><a name="l15318"></a><span class="lineno">15318</span>&#160;                {</div>
+<div class="line"><a name="l15319"></a><span class="lineno">15319</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = m_Budget.m_VulkanUsage[heapIndex] +</div>
+<div class="line"><a name="l15320"></a><span class="lineno">15320</span>&#160;                        outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
+<div class="line"><a name="l15321"></a><span class="lineno">15321</span>&#160;                }</div>
+<div class="line"><a name="l15322"></a><span class="lineno">15322</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15323"></a><span class="lineno">15323</span>&#160;                {</div>
+<div class="line"><a name="l15324"></a><span class="lineno">15324</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = 0;</div>
+<div class="line"><a name="l15325"></a><span class="lineno">15325</span>&#160;                }</div>
+<div class="line"><a name="l15326"></a><span class="lineno">15326</span>&#160; </div>
+<div class="line"><a name="l15327"></a><span class="lineno">15327</span>&#160;                <span class="comment">// Have to take MIN with heap size because explicit HeapSizeLimit is included in it.</span></div>
+<div class="line"><a name="l15328"></a><span class="lineno">15328</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = VMA_MIN(</div>
+<div class="line"><a name="l15329"></a><span class="lineno">15329</span>&#160;                    m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l15330"></a><span class="lineno">15330</span>&#160;            }</div>
+<div class="line"><a name="l15331"></a><span class="lineno">15331</span>&#160;        }</div>
+<div class="line"><a name="l15332"></a><span class="lineno">15332</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15333"></a><span class="lineno">15333</span>&#160;        {</div>
+<div class="line"><a name="l15334"></a><span class="lineno">15334</span>&#160;            UpdateVulkanBudget(); <span class="comment">// Outside of mutex lock</span></div>
+<div class="line"><a name="l15335"></a><span class="lineno">15335</span>&#160;            GetBudget(outBudget, firstHeap, heapCount); <span class="comment">// Recursion</span></div>
+<div class="line"><a name="l15336"></a><span class="lineno">15336</span>&#160;        }</div>
+<div class="line"><a name="l15337"></a><span class="lineno">15337</span>&#160;    }</div>
+<div class="line"><a name="l15338"></a><span class="lineno">15338</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15339"></a><span class="lineno">15339</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15340"></a><span class="lineno">15340</span>&#160;    {</div>
+<div class="line"><a name="l15341"></a><span class="lineno">15341</span>&#160;        <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l15342"></a><span class="lineno">15342</span>&#160;        {</div>
+<div class="line"><a name="l15343"></a><span class="lineno">15343</span>&#160;            <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l15344"></a><span class="lineno">15344</span>&#160; </div>
+<div class="line"><a name="l15345"></a><span class="lineno">15345</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15346"></a><span class="lineno">15346</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
+<div class="line"><a name="l15347"></a><span class="lineno">15347</span>&#160; </div>
+<div class="line"><a name="l15348"></a><span class="lineno">15348</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
+<div class="line"><a name="l15349"></a><span class="lineno">15349</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; <span class="comment">// 80% heuristics.</span></div>
+<div class="line"><a name="l15350"></a><span class="lineno">15350</span>&#160;        }</div>
+<div class="line"><a name="l15351"></a><span class="lineno">15351</span>&#160;    }</div>
+<div class="line"><a name="l15352"></a><span class="lineno">15352</span>&#160;}</div>
+<div class="line"><a name="l15353"></a><span class="lineno">15353</span>&#160; </div>
+<div class="line"><a name="l15354"></a><span class="lineno">15354</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="l15355"></a><span class="lineno">15355</span>&#160; </div>
+<div class="line"><a name="l15356"></a><span class="lineno">15356</span>&#160;VkResult VmaAllocator_T::DefragmentationBegin(</div>
+<div class="line"><a name="l15357"></a><span class="lineno">15357</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="l15358"></a><span class="lineno">15358</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l15359"></a><span class="lineno">15359</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div>
+<div class="line"><a name="l15360"></a><span class="lineno">15360</span>&#160;{</div>
+<div class="line"><a name="l15361"></a><span class="lineno">15361</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="l15362"></a><span class="lineno">15362</span>&#160;    {</div>
+<div class="line"><a name="l15363"></a><span class="lineno">15363</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#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> * <span class="keyword">sizeof</span>(VkBool32));</div>
+<div class="line"><a name="l15364"></a><span class="lineno">15364</span>&#160;    }</div>
+<div class="line"><a name="l15365"></a><span class="lineno">15365</span>&#160; </div>
+<div class="line"><a name="l15366"></a><span class="lineno">15366</span>&#160;    *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div>
+<div class="line"><a name="l15367"></a><span class="lineno">15367</span>&#160;        <span class="keyword">this</span>, m_CurrentFrameIndex.load(), info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>, pStats);</div>
+<div class="line"><a name="l15368"></a><span class="lineno">15368</span>&#160; </div>
+<div class="line"><a name="l15369"></a><span class="lineno">15369</span>&#160;    (*pContext)-&gt;AddPools(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>);</div>
+<div class="line"><a name="l15370"></a><span class="lineno">15370</span>&#160;    (*pContext)-&gt;AddAllocations(</div>
+<div class="line"><a name="l15371"></a><span class="lineno">15371</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>);</div>
+<div class="line"><a name="l15372"></a><span class="lineno">15372</span>&#160; </div>
+<div class="line"><a name="l15373"></a><span class="lineno">15373</span>&#160;    VkResult res = (*pContext)-&gt;Defragment(</div>
+<div class="line"><a name="l15374"></a><span class="lineno">15374</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l15375"></a><span class="lineno">15375</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l15376"></a><span class="lineno">15376</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats);</div>
+<div class="line"><a name="l15377"></a><span class="lineno">15377</span>&#160; </div>
+<div class="line"><a name="l15378"></a><span class="lineno">15378</span>&#160;    <span class="keywordflow">if</span>(res != VK_NOT_READY)</div>
+<div class="line"><a name="l15379"></a><span class="lineno">15379</span>&#160;    {</div>
+<div class="line"><a name="l15380"></a><span class="lineno">15380</span>&#160;        vma_delete(<span class="keyword">this</span>, *pContext);</div>
+<div class="line"><a name="l15381"></a><span class="lineno">15381</span>&#160;        *pContext = VMA_NULL;</div>
+<div class="line"><a name="l15382"></a><span class="lineno">15382</span>&#160;    }</div>
+<div class="line"><a name="l15383"></a><span class="lineno">15383</span>&#160; </div>
+<div class="line"><a name="l15384"></a><span class="lineno">15384</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15385"></a><span class="lineno">15385</span>&#160;}</div>
+<div class="line"><a name="l15386"></a><span class="lineno">15386</span>&#160; </div>
+<div class="line"><a name="l15387"></a><span class="lineno">15387</span>&#160;VkResult VmaAllocator_T::DefragmentationEnd(</div>
+<div class="line"><a name="l15388"></a><span class="lineno">15388</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l15389"></a><span class="lineno">15389</span>&#160;{</div>
+<div class="line"><a name="l15390"></a><span class="lineno">15390</span>&#160;    vma_delete(<span class="keyword">this</span>, context);</div>
+<div class="line"><a name="l15391"></a><span class="lineno">15391</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15392"></a><span class="lineno">15392</span>&#160;}</div>
+<div class="line"><a name="l15393"></a><span class="lineno">15393</span>&#160; </div>
+<div class="line"><a name="l15394"></a><span class="lineno">15394</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="l15395"></a><span class="lineno">15395</span>&#160;{</div>
+<div class="line"><a name="l15396"></a><span class="lineno">15396</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l15397"></a><span class="lineno">15397</span>&#160;    {</div>
+<div class="line"><a name="l15398"></a><span class="lineno">15398</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l15399"></a><span class="lineno">15399</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div>
+<div class="line"><a name="l15400"></a><span class="lineno">15400</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div>
+<div class="line"><a name="l15401"></a><span class="lineno">15401</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l15402"></a><span class="lineno">15402</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15403"></a><span class="lineno">15403</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15404"></a><span class="lineno">15404</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15405"></a><span class="lineno">15405</span>&#160;        {</div>
+<div class="line"><a name="l15406"></a><span class="lineno">15406</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15407"></a><span class="lineno">15407</span>&#160;            {</div>
+<div class="line"><a name="l15408"></a><span class="lineno">15408</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div>
+<div class="line"><a name="l15409"></a><span class="lineno">15409</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="l15410"></a><span class="lineno">15410</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div>
+<div class="line"><a name="l15411"></a><span class="lineno">15411</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="l15412"></a><span class="lineno">15412</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l15413"></a><span class="lineno">15413</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="l15414"></a><span class="lineno">15414</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l15415"></a><span class="lineno">15415</span>&#160;            }</div>
+<div class="line"><a name="l15416"></a><span class="lineno">15416</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15417"></a><span class="lineno">15417</span>&#160;            {</div>
+<div class="line"><a name="l15418"></a><span class="lineno">15418</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="l15419"></a><span class="lineno">15419</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="l15420"></a><span class="lineno">15420</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="l15421"></a><span class="lineno">15421</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="l15422"></a><span class="lineno">15422</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l15423"></a><span class="lineno">15423</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="l15424"></a><span class="lineno">15424</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l15425"></a><span class="lineno">15425</span>&#160;            }</div>
+<div class="line"><a name="l15426"></a><span class="lineno">15426</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15427"></a><span class="lineno">15427</span>&#160;            {</div>
+<div class="line"><a name="l15428"></a><span class="lineno">15428</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15429"></a><span class="lineno">15429</span>&#160;                {</div>
+<div class="line"><a name="l15430"></a><span class="lineno">15430</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15431"></a><span class="lineno">15431</span>&#160;                }</div>
+<div class="line"><a name="l15432"></a><span class="lineno">15432</span>&#160;            }</div>
+<div class="line"><a name="l15433"></a><span class="lineno">15433</span>&#160;        }</div>
+<div class="line"><a name="l15434"></a><span class="lineno">15434</span>&#160;    }</div>
+<div class="line"><a name="l15435"></a><span class="lineno">15435</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15436"></a><span class="lineno">15436</span>&#160;    {</div>
+<div class="line"><a name="l15437"></a><span class="lineno">15437</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l15438"></a><span class="lineno">15438</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15439"></a><span class="lineno">15439</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15440"></a><span class="lineno">15440</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15441"></a><span class="lineno">15441</span>&#160;        {</div>
+<div class="line"><a name="l15442"></a><span class="lineno">15442</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l15443"></a><span class="lineno">15443</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15444"></a><span class="lineno">15444</span>&#160;            {</div>
+<div class="line"><a name="l15445"></a><span class="lineno">15445</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15446"></a><span class="lineno">15446</span>&#160;            }</div>
+<div class="line"><a name="l15447"></a><span class="lineno">15447</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15448"></a><span class="lineno">15448</span>&#160;            {</div>
+<div class="line"><a name="l15449"></a><span class="lineno">15449</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15450"></a><span class="lineno">15450</span>&#160;                {</div>
+<div class="line"><a name="l15451"></a><span class="lineno">15451</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15452"></a><span class="lineno">15452</span>&#160;                }</div>
+<div class="line"><a name="l15453"></a><span class="lineno">15453</span>&#160;            }</div>
+<div class="line"><a name="l15454"></a><span class="lineno">15454</span>&#160;        }</div>
+<div class="line"><a name="l15455"></a><span class="lineno">15455</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15456"></a><span class="lineno">15456</span>&#160; </div>
+<div class="line"><a name="l15457"></a><span class="lineno">15457</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="l15458"></a><span class="lineno">15458</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="l15459"></a><span class="lineno">15459</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="l15460"></a><span class="lineno">15460</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="l15461"></a><span class="lineno">15461</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="l15462"></a><span class="lineno">15462</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="l15463"></a><span class="lineno">15463</span>&#160;    }</div>
+<div class="line"><a name="l15464"></a><span class="lineno">15464</span>&#160;}</div>
+<div class="line"><a name="l15465"></a><span class="lineno">15465</span>&#160; </div>
+<div class="line"><a name="l15466"></a><span class="lineno">15466</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="l15467"></a><span class="lineno">15467</span>&#160;{</div>
+<div class="line"><a name="l15468"></a><span class="lineno">15468</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div>
+<div class="line"><a name="l15469"></a><span class="lineno">15469</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l15470"></a><span class="lineno">15470</span>&#160;    {</div>
+<div class="line"><a name="l15471"></a><span class="lineno">15471</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15472"></a><span class="lineno">15472</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15473"></a><span class="lineno">15473</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15474"></a><span class="lineno">15474</span>&#160;        {</div>
+<div class="line"><a name="l15475"></a><span class="lineno">15475</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15476"></a><span class="lineno">15476</span>&#160;            {</div>
+<div class="line"><a name="l15477"></a><span class="lineno">15477</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15478"></a><span class="lineno">15478</span>&#160;            }</div>
+<div class="line"><a name="l15479"></a><span class="lineno">15479</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15480"></a><span class="lineno">15480</span>&#160;            {</div>
+<div class="line"><a name="l15481"></a><span class="lineno">15481</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15482"></a><span class="lineno">15482</span>&#160;            }</div>
+<div class="line"><a name="l15483"></a><span class="lineno">15483</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15484"></a><span class="lineno">15484</span>&#160;            {</div>
+<div class="line"><a name="l15485"></a><span class="lineno">15485</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15486"></a><span class="lineno">15486</span>&#160;                {</div>
+<div class="line"><a name="l15487"></a><span class="lineno">15487</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15488"></a><span class="lineno">15488</span>&#160;                }</div>
+<div class="line"><a name="l15489"></a><span class="lineno">15489</span>&#160;            }</div>
+<div class="line"><a name="l15490"></a><span class="lineno">15490</span>&#160;        }</div>
+<div class="line"><a name="l15491"></a><span class="lineno">15491</span>&#160;    }</div>
+<div class="line"><a name="l15492"></a><span class="lineno">15492</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15493"></a><span class="lineno">15493</span>&#160;    {</div>
+<div class="line"><a name="l15494"></a><span class="lineno">15494</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l15495"></a><span class="lineno">15495</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15496"></a><span class="lineno">15496</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15497"></a><span class="lineno">15497</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15498"></a><span class="lineno">15498</span>&#160;        {</div>
+<div class="line"><a name="l15499"></a><span class="lineno">15499</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l15500"></a><span class="lineno">15500</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15501"></a><span class="lineno">15501</span>&#160;            {</div>
+<div class="line"><a name="l15502"></a><span class="lineno">15502</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15503"></a><span class="lineno">15503</span>&#160;            }</div>
+<div class="line"><a name="l15504"></a><span class="lineno">15504</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15505"></a><span class="lineno">15505</span>&#160;            {</div>
+<div class="line"><a name="l15506"></a><span class="lineno">15506</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15507"></a><span class="lineno">15507</span>&#160;                {</div>
+<div class="line"><a name="l15508"></a><span class="lineno">15508</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15509"></a><span class="lineno">15509</span>&#160;                }</div>
+<div class="line"><a name="l15510"></a><span class="lineno">15510</span>&#160;            }</div>
+<div class="line"><a name="l15511"></a><span class="lineno">15511</span>&#160;        }</div>
+<div class="line"><a name="l15512"></a><span class="lineno">15512</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15513"></a><span class="lineno">15513</span>&#160; </div>
+<div class="line"><a name="l15514"></a><span class="lineno">15514</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15515"></a><span class="lineno">15515</span>&#160;    }</div>
+<div class="line"><a name="l15516"></a><span class="lineno">15516</span>&#160;}</div>
+<div class="line"><a name="l15517"></a><span class="lineno">15517</span>&#160; </div>
+<div class="line"><a name="l15518"></a><span class="lineno">15518</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="l15519"></a><span class="lineno">15519</span>&#160;{</div>
+<div class="line"><a name="l15520"></a><span class="lineno">15520</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="l15521"></a><span class="lineno">15521</span>&#160; </div>
+<div class="line"><a name="l15522"></a><span class="lineno">15522</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div>
+<div class="line"><a name="l15523"></a><span class="lineno">15523</span>&#160; </div>
+<div class="line"><a name="l15524"></a><span class="lineno">15524</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="l15525"></a><span class="lineno">15525</span>&#160;    {</div>
+<div class="line"><a name="l15526"></a><span class="lineno">15526</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div>
+<div class="line"><a name="l15527"></a><span class="lineno">15527</span>&#160;    }</div>
+<div class="line"><a name="l15528"></a><span class="lineno">15528</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="l15529"></a><span class="lineno">15529</span>&#160;    {</div>
+<div class="line"><a name="l15530"></a><span class="lineno">15530</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l15531"></a><span class="lineno">15531</span>&#160;    }</div>
+<div class="line"><a name="l15532"></a><span class="lineno">15532</span>&#160; </div>
+<div class="line"><a name="l15533"></a><span class="lineno">15533</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="l15534"></a><span class="lineno">15534</span>&#160; </div>
+<div class="line"><a name="l15535"></a><span class="lineno">15535</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="l15536"></a><span class="lineno">15536</span>&#160; </div>
+<div class="line"><a name="l15537"></a><span class="lineno">15537</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div>
+<div class="line"><a name="l15538"></a><span class="lineno">15538</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l15539"></a><span class="lineno">15539</span>&#160;    {</div>
+<div class="line"><a name="l15540"></a><span class="lineno">15540</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div>
+<div class="line"><a name="l15541"></a><span class="lineno">15541</span>&#160;        *pPool = VMA_NULL;</div>
+<div class="line"><a name="l15542"></a><span class="lineno">15542</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15543"></a><span class="lineno">15543</span>&#160;    }</div>
+<div class="line"><a name="l15544"></a><span class="lineno">15544</span>&#160; </div>
+<div class="line"><a name="l15545"></a><span class="lineno">15545</span>&#160;    <span class="comment">// Add to m_Pools.</span></div>
+<div class="line"><a name="l15546"></a><span class="lineno">15546</span>&#160;    {</div>
+<div class="line"><a name="l15547"></a><span class="lineno">15547</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15548"></a><span class="lineno">15548</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div>
+<div class="line"><a name="l15549"></a><span class="lineno">15549</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div>
+<div class="line"><a name="l15550"></a><span class="lineno">15550</span>&#160;    }</div>
+<div class="line"><a name="l15551"></a><span class="lineno">15551</span>&#160; </div>
+<div class="line"><a name="l15552"></a><span class="lineno">15552</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15553"></a><span class="lineno">15553</span>&#160;}</div>
+<div class="line"><a name="l15554"></a><span class="lineno">15554</span>&#160; </div>
+<div class="line"><a name="l15555"></a><span class="lineno">15555</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="l15556"></a><span class="lineno">15556</span>&#160;{</div>
+<div class="line"><a name="l15557"></a><span class="lineno">15557</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div>
+<div class="line"><a name="l15558"></a><span class="lineno">15558</span>&#160;    {</div>
+<div class="line"><a name="l15559"></a><span class="lineno">15559</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15560"></a><span class="lineno">15560</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div>
+<div class="line"><a name="l15561"></a><span class="lineno">15561</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div>
+<div class="line"><a name="l15562"></a><span class="lineno">15562</span>&#160;    }</div>
+<div class="line"><a name="l15563"></a><span class="lineno">15563</span>&#160; </div>
+<div class="line"><a name="l15564"></a><span class="lineno">15564</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div>
+<div class="line"><a name="l15565"></a><span class="lineno">15565</span>&#160;}</div>
+<div class="line"><a name="l15566"></a><span class="lineno">15566</span>&#160; </div>
+<div class="line"><a name="l15567"></a><span class="lineno">15567</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="l15568"></a><span class="lineno">15568</span>&#160;{</div>
+<div class="line"><a name="l15569"></a><span class="lineno">15569</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div>
+<div class="line"><a name="l15570"></a><span class="lineno">15570</span>&#160;}</div>
+<div class="line"><a name="l15571"></a><span class="lineno">15571</span>&#160; </div>
+<div class="line"><a name="l15572"></a><span class="lineno">15572</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div>
+<div class="line"><a name="l15573"></a><span class="lineno">15573</span>&#160;{</div>
+<div class="line"><a name="l15574"></a><span class="lineno">15574</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div>
+<div class="line"><a name="l15575"></a><span class="lineno">15575</span>&#160; </div>
+<div class="line"><a name="l15576"></a><span class="lineno">15576</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15577"></a><span class="lineno">15577</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l15578"></a><span class="lineno">15578</span>&#160;    {</div>
+<div class="line"><a name="l15579"></a><span class="lineno">15579</span>&#160;        UpdateVulkanBudget();</div>
+<div class="line"><a name="l15580"></a><span class="lineno">15580</span>&#160;    }</div>
+<div class="line"><a name="l15581"></a><span class="lineno">15581</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15582"></a><span class="lineno">15582</span>&#160;}</div>
+<div class="line"><a name="l15583"></a><span class="lineno">15583</span>&#160; </div>
+<div class="line"><a name="l15584"></a><span class="lineno">15584</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l15585"></a><span class="lineno">15585</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
+<div class="line"><a name="l15586"></a><span class="lineno">15586</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l15587"></a><span class="lineno">15587</span>&#160;{</div>
+<div class="line"><a name="l15588"></a><span class="lineno">15588</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div>
+<div class="line"><a name="l15589"></a><span class="lineno">15589</span>&#160;        m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l15590"></a><span class="lineno">15590</span>&#160;        pLostAllocationCount);</div>
+<div class="line"><a name="l15591"></a><span class="lineno">15591</span>&#160;}</div>
+<div class="line"><a name="l15592"></a><span class="lineno">15592</span>&#160; </div>
+<div class="line"><a name="l15593"></a><span class="lineno">15593</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div>
+<div class="line"><a name="l15594"></a><span class="lineno">15594</span>&#160;{</div>
+<div class="line"><a name="l15595"></a><span class="lineno">15595</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l15596"></a><span class="lineno">15596</span>&#160;}</div>
+<div class="line"><a name="l15597"></a><span class="lineno">15597</span>&#160; </div>
+<div class="line"><a name="l15598"></a><span class="lineno">15598</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div>
+<div class="line"><a name="l15599"></a><span class="lineno">15599</span>&#160;{</div>
+<div class="line"><a name="l15600"></a><span class="lineno">15600</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l15601"></a><span class="lineno">15601</span>&#160; </div>
+<div class="line"><a name="l15602"></a><span class="lineno">15602</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15603"></a><span class="lineno">15603</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15604"></a><span class="lineno">15604</span>&#160;    {</div>
+<div class="line"><a name="l15605"></a><span class="lineno">15605</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div>
+<div class="line"><a name="l15606"></a><span class="lineno">15606</span>&#160;        {</div>
+<div class="line"><a name="l15607"></a><span class="lineno">15607</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15608"></a><span class="lineno">15608</span>&#160;            VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l15609"></a><span class="lineno">15609</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div>
+<div class="line"><a name="l15610"></a><span class="lineno">15610</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l15611"></a><span class="lineno">15611</span>&#160;            {</div>
+<div class="line"><a name="l15612"></a><span class="lineno">15612</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l15613"></a><span class="lineno">15613</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15614"></a><span class="lineno">15614</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l15615"></a><span class="lineno">15615</span>&#160;                finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l15616"></a><span class="lineno">15616</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15617"></a><span class="lineno">15617</span>&#160;            <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15618"></a><span class="lineno">15618</span>&#160;                <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l15619"></a><span class="lineno">15619</span>&#160;            }</div>
+<div class="line"><a name="l15620"></a><span class="lineno">15620</span>&#160;        }</div>
+<div class="line"><a name="l15621"></a><span class="lineno">15621</span>&#160;    }</div>
+<div class="line"><a name="l15622"></a><span class="lineno">15622</span>&#160; </div>
+<div class="line"><a name="l15623"></a><span class="lineno">15623</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15624"></a><span class="lineno">15624</span>&#160;    {</div>
+<div class="line"><a name="l15625"></a><span class="lineno">15625</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15626"></a><span class="lineno">15626</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="l15627"></a><span class="lineno">15627</span>&#160;        {</div>
+<div class="line"><a name="l15628"></a><span class="lineno">15628</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="l15629"></a><span class="lineno">15629</span>&#160;            {</div>
+<div class="line"><a name="l15630"></a><span class="lineno">15630</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l15631"></a><span class="lineno">15631</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l15632"></a><span class="lineno">15632</span>&#160;                {</div>
+<div class="line"><a name="l15633"></a><span class="lineno">15633</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l15634"></a><span class="lineno">15634</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15635"></a><span class="lineno">15635</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l15636"></a><span class="lineno">15636</span>&#160;                    finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l15637"></a><span class="lineno">15637</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15638"></a><span class="lineno">15638</span>&#160;                <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15639"></a><span class="lineno">15639</span>&#160;                    <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l15640"></a><span class="lineno">15640</span>&#160;                }</div>
+<div class="line"><a name="l15641"></a><span class="lineno">15641</span>&#160;            }</div>
+<div class="line"><a name="l15642"></a><span class="lineno">15642</span>&#160;        }</div>
+<div class="line"><a name="l15643"></a><span class="lineno">15643</span>&#160;    }</div>
+<div class="line"><a name="l15644"></a><span class="lineno">15644</span>&#160; </div>
+<div class="line"><a name="l15645"></a><span class="lineno">15645</span>&#160;    <span class="keywordflow">return</span> finalRes;</div>
+<div class="line"><a name="l15646"></a><span class="lineno">15646</span>&#160;}</div>
+<div class="line"><a name="l15647"></a><span class="lineno">15647</span>&#160; </div>
+<div class="line"><a name="l15648"></a><span class="lineno">15648</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="l15649"></a><span class="lineno">15649</span>&#160;{</div>
+<div class="line"><a name="l15650"></a><span class="lineno">15650</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l15651"></a><span class="lineno">15651</span>&#160;    (*pAllocation)-&gt;Ctor(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l15652"></a><span class="lineno">15652</span>&#160;    (*pAllocation)-&gt;InitLost();</div>
+<div class="line"><a name="l15653"></a><span class="lineno">15653</span>&#160;}</div>
+<div class="line"><a name="l15654"></a><span class="lineno">15654</span>&#160; </div>
+<div class="line"><a name="l15655"></a><span class="lineno">15655</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div>
+<div class="line"><a name="l15656"></a><span class="lineno">15656</span>&#160;{</div>
+<div class="line"><a name="l15657"></a><span class="lineno">15657</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div>
+<div class="line"><a name="l15658"></a><span class="lineno">15658</span>&#160; </div>
+<div class="line"><a name="l15659"></a><span class="lineno">15659</span>&#160;    <span class="comment">// HeapSizeLimit is in effect for this heap.</span></div>
+<div class="line"><a name="l15660"></a><span class="lineno">15660</span>&#160;    <span class="keywordflow">if</span>((m_HeapSizeLimitMask | (1u &lt;&lt; heapIndex)) != 0)</div>
+<div class="line"><a name="l15661"></a><span class="lineno">15661</span>&#160;    {</div>
+<div class="line"><a name="l15662"></a><span class="lineno">15662</span>&#160;        <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l15663"></a><span class="lineno">15663</span>&#160;        VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15664"></a><span class="lineno">15664</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15665"></a><span class="lineno">15665</span>&#160;        {</div>
+<div class="line"><a name="l15666"></a><span class="lineno">15666</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo-&gt;allocationSize;</div>
+<div class="line"><a name="l15667"></a><span class="lineno">15667</span>&#160;            <span class="keywordflow">if</span>(blockBytesAfterAllocation &gt; heapSize)</div>
+<div class="line"><a name="l15668"></a><span class="lineno">15668</span>&#160;            {</div>
+<div class="line"><a name="l15669"></a><span class="lineno">15669</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15670"></a><span class="lineno">15670</span>&#160;            }</div>
+<div class="line"><a name="l15671"></a><span class="lineno">15671</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_BlockBytes-&gt;compare_exchange_strong(blockBytes, blockBytesAfterAllocation))</div>
+<div class="line"><a name="l15672"></a><span class="lineno">15672</span>&#160;            {</div>
+<div class="line"><a name="l15673"></a><span class="lineno">15673</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15674"></a><span class="lineno">15674</span>&#160;            }</div>
+<div class="line"><a name="l15675"></a><span class="lineno">15675</span>&#160;        }</div>
+<div class="line"><a name="l15676"></a><span class="lineno">15676</span>&#160;    }</div>
+<div class="line"><a name="l15677"></a><span class="lineno">15677</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15678"></a><span class="lineno">15678</span>&#160;    {</div>
+<div class="line"><a name="l15679"></a><span class="lineno">15679</span>&#160;        m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo-&gt;allocationSize;</div>
+<div class="line"><a name="l15680"></a><span class="lineno">15680</span>&#160;    }</div>
+<div class="line"><a name="l15681"></a><span class="lineno">15681</span>&#160; </div>
+<div class="line"><a name="l15682"></a><span class="lineno">15682</span>&#160;    <span class="comment">// VULKAN CALL vkAllocateMemory.</span></div>
+<div class="line"><a name="l15683"></a><span class="lineno">15683</span>&#160;    VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div>
+<div class="line"><a name="l15684"></a><span class="lineno">15684</span>&#160; </div>
+<div class="line"><a name="l15685"></a><span class="lineno">15685</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15686"></a><span class="lineno">15686</span>&#160;    {</div>
+<div class="line"><a name="l15687"></a><span class="lineno">15687</span>&#160;        ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l15688"></a><span class="lineno">15688</span>&#160; </div>
+<div class="line"><a name="l15689"></a><span class="lineno">15689</span>&#160;        <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l15690"></a><span class="lineno">15690</span>&#160;        <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div>
+<div class="line"><a name="l15691"></a><span class="lineno">15691</span>&#160;        {</div>
+<div class="line"><a name="l15692"></a><span class="lineno">15692</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="l15693"></a><span class="lineno">15693</span>&#160;        }</div>
+<div class="line"><a name="l15694"></a><span class="lineno">15694</span>&#160;    }</div>
+<div class="line"><a name="l15695"></a><span class="lineno">15695</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15696"></a><span class="lineno">15696</span>&#160;    {</div>
+<div class="line"><a name="l15697"></a><span class="lineno">15697</span>&#160;        m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div>
+<div class="line"><a name="l15698"></a><span class="lineno">15698</span>&#160;    }</div>
+<div class="line"><a name="l15699"></a><span class="lineno">15699</span>&#160; </div>
+<div class="line"><a name="l15700"></a><span class="lineno">15700</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15701"></a><span class="lineno">15701</span>&#160;}</div>
+<div class="line"><a name="l15702"></a><span class="lineno">15702</span>&#160; </div>
+<div class="line"><a name="l15703"></a><span class="lineno">15703</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div>
+<div class="line"><a name="l15704"></a><span class="lineno">15704</span>&#160;{</div>
+<div class="line"><a name="l15705"></a><span class="lineno">15705</span>&#160;    <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l15706"></a><span class="lineno">15706</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="l15707"></a><span class="lineno">15707</span>&#160;    {</div>
+<div class="line"><a name="l15708"></a><span class="lineno">15708</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="l15709"></a><span class="lineno">15709</span>&#160;    }</div>
+<div class="line"><a name="l15710"></a><span class="lineno">15710</span>&#160; </div>
+<div class="line"><a name="l15711"></a><span class="lineno">15711</span>&#160;    <span class="comment">// VULKAN CALL vkFreeMemory.</span></div>
+<div class="line"><a name="l15712"></a><span class="lineno">15712</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div>
+<div class="line"><a name="l15713"></a><span class="lineno">15713</span>&#160; </div>
+<div class="line"><a name="l15714"></a><span class="lineno">15714</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div>
+<div class="line"><a name="l15715"></a><span class="lineno">15715</span>&#160;    m_Budget.m_BlockBytes[heapIndex] -= size;</div>
+<div class="line"><a name="l15716"></a><span class="lineno">15716</span>&#160;    ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l15717"></a><span class="lineno">15717</span>&#160;}</div>
+<div class="line"><a name="l15718"></a><span class="lineno">15718</span>&#160; </div>
+<div class="line"><a name="l15719"></a><span class="lineno">15719</span>&#160;VkResult VmaAllocator_T::BindVulkanBuffer(</div>
+<div class="line"><a name="l15720"></a><span class="lineno">15720</span>&#160;    VkDeviceMemory memory,</div>
+<div class="line"><a name="l15721"></a><span class="lineno">15721</span>&#160;    VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l15722"></a><span class="lineno">15722</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l15723"></a><span class="lineno">15723</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15724"></a><span class="lineno">15724</span>&#160;{</div>
+<div class="line"><a name="l15725"></a><span class="lineno">15725</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l15726"></a><span class="lineno">15726</span>&#160;    {</div>
+<div class="line"><a name="l15727"></a><span class="lineno">15727</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15728"></a><span class="lineno">15728</span>&#160;        <span class="keywordflow">if</span>(m_UseKhrBindMemory2 &amp;&amp; m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l15729"></a><span class="lineno">15729</span>&#160;        {</div>
+<div class="line"><a name="l15730"></a><span class="lineno">15730</span>&#160;            VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l15731"></a><span class="lineno">15731</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l15732"></a><span class="lineno">15732</span>&#160;            bindBufferMemoryInfo.buffer = buffer;</div>
+<div class="line"><a name="l15733"></a><span class="lineno">15733</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l15734"></a><span class="lineno">15734</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l15735"></a><span class="lineno">15735</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
+<div class="line"><a name="l15736"></a><span class="lineno">15736</span>&#160;        }</div>
+<div class="line"><a name="l15737"></a><span class="lineno">15737</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15738"></a><span class="lineno">15738</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15739"></a><span class="lineno">15739</span>&#160;        {</div>
+<div class="line"><a name="l15740"></a><span class="lineno">15740</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l15741"></a><span class="lineno">15741</span>&#160;        }</div>
+<div class="line"><a name="l15742"></a><span class="lineno">15742</span>&#160;    }</div>
+<div class="line"><a name="l15743"></a><span class="lineno">15743</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15744"></a><span class="lineno">15744</span>&#160;    {</div>
+<div class="line"><a name="l15745"></a><span class="lineno">15745</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div>
+<div class="line"><a name="l15746"></a><span class="lineno">15746</span>&#160;    }</div>
+<div class="line"><a name="l15747"></a><span class="lineno">15747</span>&#160;}</div>
+<div class="line"><a name="l15748"></a><span class="lineno">15748</span>&#160; </div>
+<div class="line"><a name="l15749"></a><span class="lineno">15749</span>&#160;VkResult VmaAllocator_T::BindVulkanImage(</div>
+<div class="line"><a name="l15750"></a><span class="lineno">15750</span>&#160;    VkDeviceMemory memory,</div>
+<div class="line"><a name="l15751"></a><span class="lineno">15751</span>&#160;    VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l15752"></a><span class="lineno">15752</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l15753"></a><span class="lineno">15753</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15754"></a><span class="lineno">15754</span>&#160;{</div>
+<div class="line"><a name="l15755"></a><span class="lineno">15755</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l15756"></a><span class="lineno">15756</span>&#160;    {</div>
+<div class="line"><a name="l15757"></a><span class="lineno">15757</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15758"></a><span class="lineno">15758</span>&#160;        <span class="keywordflow">if</span>(m_UseKhrBindMemory2 &amp;&amp; m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l15759"></a><span class="lineno">15759</span>&#160;        {</div>
+<div class="line"><a name="l15760"></a><span class="lineno">15760</span>&#160;            VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l15761"></a><span class="lineno">15761</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l15762"></a><span class="lineno">15762</span>&#160;            bindBufferMemoryInfo.image = image;</div>
+<div class="line"><a name="l15763"></a><span class="lineno">15763</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l15764"></a><span class="lineno">15764</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l15765"></a><span class="lineno">15765</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
+<div class="line"><a name="l15766"></a><span class="lineno">15766</span>&#160;        }</div>
+<div class="line"><a name="l15767"></a><span class="lineno">15767</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15768"></a><span class="lineno">15768</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15769"></a><span class="lineno">15769</span>&#160;        {</div>
+<div class="line"><a name="l15770"></a><span class="lineno">15770</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l15771"></a><span class="lineno">15771</span>&#160;        }</div>
+<div class="line"><a name="l15772"></a><span class="lineno">15772</span>&#160;    }</div>
+<div class="line"><a name="l15773"></a><span class="lineno">15773</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15774"></a><span class="lineno">15774</span>&#160;    {</div>
+<div class="line"><a name="l15775"></a><span class="lineno">15775</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div>
+<div class="line"><a name="l15776"></a><span class="lineno">15776</span>&#160;    }</div>
+<div class="line"><a name="l15777"></a><span class="lineno">15777</span>&#160;}</div>
+<div class="line"><a name="l15778"></a><span class="lineno">15778</span>&#160; </div>
+<div class="line"><a name="l15779"></a><span class="lineno">15779</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="l15780"></a><span class="lineno">15780</span>&#160;{</div>
+<div class="line"><a name="l15781"></a><span class="lineno">15781</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l15782"></a><span class="lineno">15782</span>&#160;    {</div>
+<div class="line"><a name="l15783"></a><span class="lineno">15783</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l15784"></a><span class="lineno">15784</span>&#160;    }</div>
+<div class="line"><a name="l15785"></a><span class="lineno">15785</span>&#160; </div>
+<div class="line"><a name="l15786"></a><span class="lineno">15786</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l15787"></a><span class="lineno">15787</span>&#160;    {</div>
+<div class="line"><a name="l15788"></a><span class="lineno">15788</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15789"></a><span class="lineno">15789</span>&#160;        {</div>
+<div class="line"><a name="l15790"></a><span class="lineno">15790</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l15791"></a><span class="lineno">15791</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div>
+<div class="line"><a name="l15792"></a><span class="lineno">15792</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="l15793"></a><span class="lineno">15793</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15794"></a><span class="lineno">15794</span>&#160;            {</div>
+<div class="line"><a name="l15795"></a><span class="lineno">15795</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l15796"></a><span class="lineno">15796</span>&#160;                hAllocation-&gt;BlockAllocMap();</div>
+<div class="line"><a name="l15797"></a><span class="lineno">15797</span>&#160;            }</div>
+<div class="line"><a name="l15798"></a><span class="lineno">15798</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15799"></a><span class="lineno">15799</span>&#160;        }</div>
+<div class="line"><a name="l15800"></a><span class="lineno">15800</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15801"></a><span class="lineno">15801</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div>
+<div class="line"><a name="l15802"></a><span class="lineno">15802</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15803"></a><span class="lineno">15803</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l15804"></a><span class="lineno">15804</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l15805"></a><span class="lineno">15805</span>&#160;    }</div>
+<div class="line"><a name="l15806"></a><span class="lineno">15806</span>&#160;}</div>
+<div class="line"><a name="l15807"></a><span class="lineno">15807</span>&#160; </div>
+<div class="line"><a name="l15808"></a><span class="lineno">15808</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="l15809"></a><span class="lineno">15809</span>&#160;{</div>
+<div class="line"><a name="l15810"></a><span class="lineno">15810</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l15811"></a><span class="lineno">15811</span>&#160;    {</div>
+<div class="line"><a name="l15812"></a><span class="lineno">15812</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15813"></a><span class="lineno">15813</span>&#160;        {</div>
+<div class="line"><a name="l15814"></a><span class="lineno">15814</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l15815"></a><span class="lineno">15815</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div>
+<div class="line"><a name="l15816"></a><span class="lineno">15816</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div>
+<div class="line"><a name="l15817"></a><span class="lineno">15817</span>&#160;        }</div>
+<div class="line"><a name="l15818"></a><span class="lineno">15818</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15819"></a><span class="lineno">15819</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15820"></a><span class="lineno">15820</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div>
+<div class="line"><a name="l15821"></a><span class="lineno">15821</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15822"></a><span class="lineno">15822</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15823"></a><span class="lineno">15823</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l15824"></a><span class="lineno">15824</span>&#160;    }</div>
+<div class="line"><a name="l15825"></a><span class="lineno">15825</span>&#160;}</div>
+<div class="line"><a name="l15826"></a><span class="lineno">15826</span>&#160; </div>
+<div class="line"><a name="l15827"></a><span class="lineno">15827</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(</div>
+<div class="line"><a name="l15828"></a><span class="lineno">15828</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l15829"></a><span class="lineno">15829</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l15830"></a><span class="lineno">15830</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l15831"></a><span class="lineno">15831</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15832"></a><span class="lineno">15832</span>&#160;{</div>
+<div class="line"><a name="l15833"></a><span class="lineno">15833</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l15834"></a><span class="lineno">15834</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l15835"></a><span class="lineno">15835</span>&#160;    {</div>
+<div class="line"><a name="l15836"></a><span class="lineno">15836</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15837"></a><span class="lineno">15837</span>&#160;        res = BindVulkanBuffer(hAllocation-&gt;GetMemory(), allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l15838"></a><span class="lineno">15838</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15839"></a><span class="lineno">15839</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15840"></a><span class="lineno">15840</span>&#160;    {</div>
+<div class="line"><a name="l15841"></a><span class="lineno">15841</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l15842"></a><span class="lineno">15842</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="l15843"></a><span class="lineno">15843</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l15844"></a><span class="lineno">15844</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15845"></a><span class="lineno">15845</span>&#160;    }</div>
+<div class="line"><a name="l15846"></a><span class="lineno">15846</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15847"></a><span class="lineno">15847</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l15848"></a><span class="lineno">15848</span>&#160;    }</div>
+<div class="line"><a name="l15849"></a><span class="lineno">15849</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15850"></a><span class="lineno">15850</span>&#160;}</div>
+<div class="line"><a name="l15851"></a><span class="lineno">15851</span>&#160; </div>
+<div class="line"><a name="l15852"></a><span class="lineno">15852</span>&#160;VkResult VmaAllocator_T::BindImageMemory(</div>
+<div class="line"><a name="l15853"></a><span class="lineno">15853</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l15854"></a><span class="lineno">15854</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l15855"></a><span class="lineno">15855</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l15856"></a><span class="lineno">15856</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15857"></a><span class="lineno">15857</span>&#160;{</div>
+<div class="line"><a name="l15858"></a><span class="lineno">15858</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l15859"></a><span class="lineno">15859</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l15860"></a><span class="lineno">15860</span>&#160;    {</div>
+<div class="line"><a name="l15861"></a><span class="lineno">15861</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15862"></a><span class="lineno">15862</span>&#160;        res = BindVulkanImage(hAllocation-&gt;GetMemory(), allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l15863"></a><span class="lineno">15863</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15864"></a><span class="lineno">15864</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15865"></a><span class="lineno">15865</span>&#160;    {</div>
+<div class="line"><a name="l15866"></a><span class="lineno">15866</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l15867"></a><span class="lineno">15867</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="l15868"></a><span class="lineno">15868</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l15869"></a><span class="lineno">15869</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15870"></a><span class="lineno">15870</span>&#160;    }</div>
+<div class="line"><a name="l15871"></a><span class="lineno">15871</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15872"></a><span class="lineno">15872</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l15873"></a><span class="lineno">15873</span>&#160;    }</div>
+<div class="line"><a name="l15874"></a><span class="lineno">15874</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15875"></a><span class="lineno">15875</span>&#160;}</div>
+<div class="line"><a name="l15876"></a><span class="lineno">15876</span>&#160; </div>
+<div class="line"><a name="l15877"></a><span class="lineno">15877</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div>
+<div class="line"><a name="l15878"></a><span class="lineno">15878</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l15879"></a><span class="lineno">15879</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l15880"></a><span class="lineno">15880</span>&#160;    VMA_CACHE_OPERATION op)</div>
+<div class="line"><a name="l15881"></a><span class="lineno">15881</span>&#160;{</div>
+<div class="line"><a name="l15882"></a><span class="lineno">15882</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15883"></a><span class="lineno">15883</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div>
+<div class="line"><a name="l15884"></a><span class="lineno">15884</span>&#160;    {</div>
+<div class="line"><a name="l15885"></a><span class="lineno">15885</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l15886"></a><span class="lineno">15886</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div>
+<div class="line"><a name="l15887"></a><span class="lineno">15887</span>&#160; </div>
+<div class="line"><a name="l15888"></a><span class="lineno">15888</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l15889"></a><span class="lineno">15889</span>&#160; </div>
+<div class="line"><a name="l15890"></a><span class="lineno">15890</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
+<div class="line"><a name="l15891"></a><span class="lineno">15891</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div>
+<div class="line"><a name="l15892"></a><span class="lineno">15892</span>&#160;        </div>
+<div class="line"><a name="l15893"></a><span class="lineno">15893</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l15894"></a><span class="lineno">15894</span>&#160;        {</div>
+<div class="line"><a name="l15895"></a><span class="lineno">15895</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15896"></a><span class="lineno">15896</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l15897"></a><span class="lineno">15897</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l15898"></a><span class="lineno">15898</span>&#160;            {</div>
+<div class="line"><a name="l15899"></a><span class="lineno">15899</span>&#160;                memRange.size = allocationSize - memRange.offset;</div>
+<div class="line"><a name="l15900"></a><span class="lineno">15900</span>&#160;            }</div>
+<div class="line"><a name="l15901"></a><span class="lineno">15901</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15902"></a><span class="lineno">15902</span>&#160;            {</div>
+<div class="line"><a name="l15903"></a><span class="lineno">15903</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
+<div class="line"><a name="l15904"></a><span class="lineno">15904</span>&#160;                memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l15905"></a><span class="lineno">15905</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l15906"></a><span class="lineno">15906</span>&#160;                    allocationSize - memRange.offset);</div>
+<div class="line"><a name="l15907"></a><span class="lineno">15907</span>&#160;            }</div>
+<div class="line"><a name="l15908"></a><span class="lineno">15908</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15909"></a><span class="lineno">15909</span>&#160; </div>
+<div class="line"><a name="l15910"></a><span class="lineno">15910</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15911"></a><span class="lineno">15911</span>&#160;        {</div>
+<div class="line"><a name="l15912"></a><span class="lineno">15912</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div>
+<div class="line"><a name="l15913"></a><span class="lineno">15913</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l15914"></a><span class="lineno">15914</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l15915"></a><span class="lineno">15915</span>&#160;            {</div>
+<div class="line"><a name="l15916"></a><span class="lineno">15916</span>&#160;                size = allocationSize - offset;</div>
+<div class="line"><a name="l15917"></a><span class="lineno">15917</span>&#160;            }</div>
+<div class="line"><a name="l15918"></a><span class="lineno">15918</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15919"></a><span class="lineno">15919</span>&#160;            {</div>
+<div class="line"><a name="l15920"></a><span class="lineno">15920</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
+<div class="line"><a name="l15921"></a><span class="lineno">15921</span>&#160;            }</div>
+<div class="line"><a name="l15922"></a><span class="lineno">15922</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div>
+<div class="line"><a name="l15923"></a><span class="lineno">15923</span>&#160; </div>
+<div class="line"><a name="l15924"></a><span class="lineno">15924</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div>
+<div class="line"><a name="l15925"></a><span class="lineno">15925</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l15926"></a><span class="lineno">15926</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div>
+<div class="line"><a name="l15927"></a><span class="lineno">15927</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l15928"></a><span class="lineno">15928</span>&#160;            memRange.offset += allocationOffset;</div>
+<div class="line"><a name="l15929"></a><span class="lineno">15929</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div>
+<div class="line"><a name="l15930"></a><span class="lineno">15930</span>&#160;            </div>
+<div class="line"><a name="l15931"></a><span class="lineno">15931</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15932"></a><span class="lineno">15932</span>&#160;        }</div>
+<div class="line"><a name="l15933"></a><span class="lineno">15933</span>&#160;        </div>
+<div class="line"><a name="l15934"></a><span class="lineno">15934</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15935"></a><span class="lineno">15935</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l15936"></a><span class="lineno">15936</span>&#160;        }</div>
+<div class="line"><a name="l15937"></a><span class="lineno">15937</span>&#160; </div>
+<div class="line"><a name="l15938"></a><span class="lineno">15938</span>&#160;        <span class="keywordflow">switch</span>(op)</div>
+<div class="line"><a name="l15939"></a><span class="lineno">15939</span>&#160;        {</div>
+<div class="line"><a name="l15940"></a><span class="lineno">15940</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
+<div class="line"><a name="l15941"></a><span class="lineno">15941</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l15942"></a><span class="lineno">15942</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15943"></a><span class="lineno">15943</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
+<div class="line"><a name="l15944"></a><span class="lineno">15944</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l15945"></a><span class="lineno">15945</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15946"></a><span class="lineno">15946</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15947"></a><span class="lineno">15947</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l15948"></a><span class="lineno">15948</span>&#160;        }</div>
+<div class="line"><a name="l15949"></a><span class="lineno">15949</span>&#160;    }</div>
+<div class="line"><a name="l15950"></a><span class="lineno">15950</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div>
+<div class="line"><a name="l15951"></a><span class="lineno">15951</span>&#160;}</div>
+<div class="line"><a name="l15952"></a><span class="lineno">15952</span>&#160; </div>
+<div class="line"><a name="l15953"></a><span class="lineno">15953</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15954"></a><span class="lineno">15954</span>&#160;{</div>
+<div class="line"><a name="l15955"></a><span class="lineno">15955</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l15956"></a><span class="lineno">15956</span>&#160; </div>
+<div class="line"><a name="l15957"></a><span class="lineno">15957</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15958"></a><span class="lineno">15958</span>&#160;    {</div>
+<div class="line"><a name="l15959"></a><span class="lineno">15959</span>&#160;        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l15960"></a><span class="lineno">15960</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l15961"></a><span class="lineno">15961</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div>
+<div class="line"><a name="l15962"></a><span class="lineno">15962</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div>
+<div class="line"><a name="l15963"></a><span class="lineno">15963</span>&#160;        VMA_ASSERT(success);</div>
+<div class="line"><a name="l15964"></a><span class="lineno">15964</span>&#160;    }</div>
+<div class="line"><a name="l15965"></a><span class="lineno">15965</span>&#160; </div>
+<div class="line"><a name="l15966"></a><span class="lineno">15966</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div>
+<div class="line"><a name="l15967"></a><span class="lineno">15967</span>&#160;    </div>
+<div class="line"><a name="l15968"></a><span class="lineno">15968</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l15969"></a><span class="lineno">15969</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="l15970"></a><span class="lineno">15970</span>&#160;<span class="comment">    before vkFreeMemory.</span></div>
+<div class="line"><a name="l15971"></a><span class="lineno">15971</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l15972"></a><span class="lineno">15972</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l15973"></a><span class="lineno">15973</span>&#160;<span class="comment">    {</span></div>
+<div class="line"><a name="l15974"></a><span class="lineno">15974</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l15975"></a><span class="lineno">15975</span>&#160;<span class="comment">    }</span></div>
+<div class="line"><a name="l15976"></a><span class="lineno">15976</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l15977"></a><span class="lineno">15977</span>&#160;    </div>
+<div class="line"><a name="l15978"></a><span class="lineno">15978</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div>
+<div class="line"><a name="l15979"></a><span class="lineno">15979</span>&#160; </div>
+<div class="line"><a name="l15980"></a><span class="lineno">15980</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div>
+<div class="line"><a name="l15981"></a><span class="lineno">15981</span>&#160;}</div>
+<div class="line"><a name="l15982"></a><span class="lineno">15982</span>&#160; </div>
+<div class="line"><a name="l15983"></a><span class="lineno">15983</span>&#160;uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div>
+<div class="line"><a name="l15984"></a><span class="lineno">15984</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l15985"></a><span class="lineno">15985</span>&#160;    VkBufferCreateInfo dummyBufCreateInfo;</div>
+<div class="line"><a name="l15986"></a><span class="lineno">15986</span>&#160;    VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div>
+<div class="line"><a name="l15987"></a><span class="lineno">15987</span>&#160; </div>
+<div class="line"><a name="l15988"></a><span class="lineno">15988</span>&#160;    uint32_t memoryTypeBits = 0;</div>
+<div class="line"><a name="l15989"></a><span class="lineno">15989</span>&#160; </div>
+<div class="line"><a name="l15990"></a><span class="lineno">15990</span>&#160;    <span class="comment">// Create buffer.</span></div>
+<div class="line"><a name="l15991"></a><span class="lineno">15991</span>&#160;    VkBuffer buf = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l15992"></a><span class="lineno">15992</span>&#160;    VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l15993"></a><span class="lineno">15993</span>&#160;        m_hDevice, &amp;dummyBufCreateInfo, GetAllocationCallbacks(), &amp;buf);</div>
+<div class="line"><a name="l15994"></a><span class="lineno">15994</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15995"></a><span class="lineno">15995</span>&#160;    {</div>
+<div class="line"><a name="l15996"></a><span class="lineno">15996</span>&#160;        <span class="comment">// Query for supported memory types.</span></div>
+<div class="line"><a name="l15997"></a><span class="lineno">15997</span>&#160;        VkMemoryRequirements memReq;</div>
+<div class="line"><a name="l15998"></a><span class="lineno">15998</span>&#160;        (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &amp;memReq);</div>
+<div class="line"><a name="l15999"></a><span class="lineno">15999</span>&#160;        memoryTypeBits = memReq.memoryTypeBits;</div>
+<div class="line"><a name="l16000"></a><span class="lineno">16000</span>&#160; </div>
+<div class="line"><a name="l16001"></a><span class="lineno">16001</span>&#160;        <span class="comment">// Destroy buffer.</span></div>
+<div class="line"><a name="l16002"></a><span class="lineno">16002</span>&#160;        (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div>
+<div class="line"><a name="l16003"></a><span class="lineno">16003</span>&#160;    }</div>
+<div class="line"><a name="l16004"></a><span class="lineno">16004</span>&#160; </div>
+<div class="line"><a name="l16005"></a><span class="lineno">16005</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l16006"></a><span class="lineno">16006</span>&#160;}</div>
+<div class="line"><a name="l16007"></a><span class="lineno">16007</span>&#160; </div>
+<div class="line"><a name="l16008"></a><span class="lineno">16008</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16009"></a><span class="lineno">16009</span>&#160; </div>
+<div class="line"><a name="l16010"></a><span class="lineno">16010</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::UpdateVulkanBudget()</div>
+<div class="line"><a name="l16011"></a><span class="lineno">16011</span>&#160;{</div>
+<div class="line"><a name="l16012"></a><span class="lineno">16012</span>&#160;    VMA_ASSERT(m_UseExtMemoryBudget);</div>
+<div class="line"><a name="l16013"></a><span class="lineno">16013</span>&#160; </div>
+<div class="line"><a name="l16014"></a><span class="lineno">16014</span>&#160;    VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };</div>
+<div class="line"><a name="l16015"></a><span class="lineno">16015</span>&#160; </div>
+<div class="line"><a name="l16016"></a><span class="lineno">16016</span>&#160;    VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };</div>
+<div class="line"><a name="l16017"></a><span class="lineno">16017</span>&#160;    memProps.pNext = &amp;budgetProps;</div>
+<div class="line"><a name="l16018"></a><span class="lineno">16018</span>&#160; </div>
+<div class="line"><a name="l16019"></a><span class="lineno">16019</span>&#160;    GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &amp;memProps);</div>
+<div class="line"><a name="l16020"></a><span class="lineno">16020</span>&#160; </div>
+<div class="line"><a name="l16021"></a><span class="lineno">16021</span>&#160;    {</div>
+<div class="line"><a name="l16022"></a><span class="lineno">16022</span>&#160;        VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l16023"></a><span class="lineno">16023</span>&#160; </div>
+<div class="line"><a name="l16024"></a><span class="lineno">16024</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l16025"></a><span class="lineno">16025</span>&#160;        {</div>
+<div class="line"><a name="l16026"></a><span class="lineno">16026</span>&#160;            m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];</div>
+<div class="line"><a name="l16027"></a><span class="lineno">16027</span>&#160;            m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];</div>
+<div class="line"><a name="l16028"></a><span class="lineno">16028</span>&#160;            m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();</div>
+<div class="line"><a name="l16029"></a><span class="lineno">16029</span>&#160;        }</div>
+<div class="line"><a name="l16030"></a><span class="lineno">16030</span>&#160;        m_Budget.m_OperationsSinceBudgetFetch = 0;</div>
+<div class="line"><a name="l16031"></a><span class="lineno">16031</span>&#160;    }</div>
+<div class="line"><a name="l16032"></a><span class="lineno">16032</span>&#160;}</div>
+<div class="line"><a name="l16033"></a><span class="lineno">16033</span>&#160; </div>
+<div class="line"><a name="l16034"></a><span class="lineno">16034</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16035"></a><span class="lineno">16035</span>&#160; </div>
+<div class="line"><a name="l16036"></a><span class="lineno">16036</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="l16037"></a><span class="lineno">16037</span>&#160;{</div>
+<div class="line"><a name="l16038"></a><span class="lineno">16038</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div>
+<div class="line"><a name="l16039"></a><span class="lineno">16039</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l16040"></a><span class="lineno">16040</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l16041"></a><span class="lineno">16041</span>&#160;    {</div>
+<div class="line"><a name="l16042"></a><span class="lineno">16042</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div>
+<div class="line"><a name="l16043"></a><span class="lineno">16043</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div>
+<div class="line"><a name="l16044"></a><span class="lineno">16044</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16045"></a><span class="lineno">16045</span>&#160;        {</div>
+<div class="line"><a name="l16046"></a><span class="lineno">16046</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="l16047"></a><span class="lineno">16047</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l16048"></a><span class="lineno">16048</span>&#160;            Unmap(hAllocation);</div>
+<div class="line"><a name="l16049"></a><span class="lineno">16049</span>&#160;        }</div>
+<div class="line"><a name="l16050"></a><span class="lineno">16050</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16051"></a><span class="lineno">16051</span>&#160;        {</div>
+<div class="line"><a name="l16052"></a><span class="lineno">16052</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="l16053"></a><span class="lineno">16053</span>&#160;        }</div>
+<div class="line"><a name="l16054"></a><span class="lineno">16054</span>&#160;    }</div>
+<div class="line"><a name="l16055"></a><span class="lineno">16055</span>&#160;}</div>
+<div class="line"><a name="l16056"></a><span class="lineno">16056</span>&#160; </div>
+<div class="line"><a name="l16057"></a><span class="lineno">16057</span>&#160;uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div>
+<div class="line"><a name="l16058"></a><span class="lineno">16058</span>&#160;{</div>
+<div class="line"><a name="l16059"></a><span class="lineno">16059</span>&#160;    uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div>
+<div class="line"><a name="l16060"></a><span class="lineno">16060</span>&#160;    <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div>
+<div class="line"><a name="l16061"></a><span class="lineno">16061</span>&#160;    {</div>
+<div class="line"><a name="l16062"></a><span class="lineno">16062</span>&#160;        memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div>
+<div class="line"><a name="l16063"></a><span class="lineno">16063</span>&#160;        m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div>
+<div class="line"><a name="l16064"></a><span class="lineno">16064</span>&#160;    }</div>
+<div class="line"><a name="l16065"></a><span class="lineno">16065</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l16066"></a><span class="lineno">16066</span>&#160;}</div>
+<div class="line"><a name="l16067"></a><span class="lineno">16067</span>&#160; </div>
+<div class="line"><a name="l16068"></a><span class="lineno">16068</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16069"></a><span class="lineno">16069</span>&#160; </div>
+<div class="line"><a name="l16070"></a><span class="lineno">16070</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div>
+<div class="line"><a name="l16071"></a><span class="lineno">16071</span>&#160;{</div>
+<div class="line"><a name="l16072"></a><span class="lineno">16072</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16073"></a><span class="lineno">16073</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l16074"></a><span class="lineno">16074</span>&#160;    {</div>
+<div class="line"><a name="l16075"></a><span class="lineno">16075</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l16076"></a><span class="lineno">16076</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l16077"></a><span class="lineno">16077</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div>
+<div class="line"><a name="l16078"></a><span class="lineno">16078</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16079"></a><span class="lineno">16079</span>&#160;        {</div>
+<div class="line"><a name="l16080"></a><span class="lineno">16080</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16081"></a><span class="lineno">16081</span>&#160;            {</div>
+<div class="line"><a name="l16082"></a><span class="lineno">16082</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l16083"></a><span class="lineno">16083</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div>
+<div class="line"><a name="l16084"></a><span class="lineno">16084</span>&#160;                json.BeginObject();</div>
+<div class="line"><a name="l16085"></a><span class="lineno">16085</span>&#160;            }</div>
+<div class="line"><a name="l16086"></a><span class="lineno">16086</span>&#160; </div>
+<div class="line"><a name="l16087"></a><span class="lineno">16087</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l16088"></a><span class="lineno">16088</span>&#160;            json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l16089"></a><span class="lineno">16089</span>&#160;            json.EndString();</div>
+<div class="line"><a name="l16090"></a><span class="lineno">16090</span>&#160;                </div>
+<div class="line"><a name="l16091"></a><span class="lineno">16091</span>&#160;            json.BeginArray();</div>
+<div class="line"><a name="l16092"></a><span class="lineno">16092</span>&#160; </div>
+<div class="line"><a name="l16093"></a><span class="lineno">16093</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="l16094"></a><span class="lineno">16094</span>&#160;            {</div>
+<div class="line"><a name="l16095"></a><span class="lineno">16095</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16096"></a><span class="lineno">16096</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="l16097"></a><span class="lineno">16097</span>&#160;                hAlloc-&gt;PrintParameters(json);</div>
+<div class="line"><a name="l16098"></a><span class="lineno">16098</span>&#160;                json.EndObject();</div>
+<div class="line"><a name="l16099"></a><span class="lineno">16099</span>&#160;            }</div>
+<div class="line"><a name="l16100"></a><span class="lineno">16100</span>&#160; </div>
+<div class="line"><a name="l16101"></a><span class="lineno">16101</span>&#160;            json.EndArray();</div>
+<div class="line"><a name="l16102"></a><span class="lineno">16102</span>&#160;        }</div>
+<div class="line"><a name="l16103"></a><span class="lineno">16103</span>&#160;    }</div>
+<div class="line"><a name="l16104"></a><span class="lineno">16104</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div>
+<div class="line"><a name="l16105"></a><span class="lineno">16105</span>&#160;    {</div>
+<div class="line"><a name="l16106"></a><span class="lineno">16106</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l16107"></a><span class="lineno">16107</span>&#160;    }</div>
+<div class="line"><a name="l16108"></a><span class="lineno">16108</span>&#160; </div>
+<div class="line"><a name="l16109"></a><span class="lineno">16109</span>&#160;    {</div>
+<div class="line"><a name="l16110"></a><span class="lineno">16110</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16111"></a><span class="lineno">16111</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l16112"></a><span class="lineno">16112</span>&#160;        {</div>
+<div class="line"><a name="l16113"></a><span class="lineno">16113</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16114"></a><span class="lineno">16114</span>&#160;            {</div>
+<div class="line"><a name="l16115"></a><span class="lineno">16115</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16116"></a><span class="lineno">16116</span>&#160;                {</div>
+<div class="line"><a name="l16117"></a><span class="lineno">16117</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l16118"></a><span class="lineno">16118</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div>
+<div class="line"><a name="l16119"></a><span class="lineno">16119</span>&#160;                    json.BeginObject();</div>
+<div class="line"><a name="l16120"></a><span class="lineno">16120</span>&#160;                }</div>
+<div class="line"><a name="l16121"></a><span class="lineno">16121</span>&#160; </div>
+<div class="line"><a name="l16122"></a><span class="lineno">16122</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l16123"></a><span class="lineno">16123</span>&#160;                json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l16124"></a><span class="lineno">16124</span>&#160;                json.EndString();</div>
+<div class="line"><a name="l16125"></a><span class="lineno">16125</span>&#160; </div>
+<div class="line"><a name="l16126"></a><span class="lineno">16126</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div>
+<div class="line"><a name="l16127"></a><span class="lineno">16127</span>&#160;            }</div>
+<div class="line"><a name="l16128"></a><span class="lineno">16128</span>&#160;        }</div>
+<div class="line"><a name="l16129"></a><span class="lineno">16129</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div>
+<div class="line"><a name="l16130"></a><span class="lineno">16130</span>&#160;        {</div>
+<div class="line"><a name="l16131"></a><span class="lineno">16131</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l16132"></a><span class="lineno">16132</span>&#160;        }</div>
+<div class="line"><a name="l16133"></a><span class="lineno">16133</span>&#160;    }</div>
+<div class="line"><a name="l16134"></a><span class="lineno">16134</span>&#160; </div>
+<div class="line"><a name="l16135"></a><span class="lineno">16135</span>&#160;    <span class="comment">// Custom pools</span></div>
+<div class="line"><a name="l16136"></a><span class="lineno">16136</span>&#160;    {</div>
+<div class="line"><a name="l16137"></a><span class="lineno">16137</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l16138"></a><span class="lineno">16138</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div>
+<div class="line"><a name="l16139"></a><span class="lineno">16139</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div>
+<div class="line"><a name="l16140"></a><span class="lineno">16140</span>&#160;        {</div>
+<div class="line"><a name="l16141"></a><span class="lineno">16141</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div>
+<div class="line"><a name="l16142"></a><span class="lineno">16142</span>&#160;            json.BeginObject();</div>
+<div class="line"><a name="l16143"></a><span class="lineno">16143</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="l16144"></a><span class="lineno">16144</span>&#160;            {</div>
+<div class="line"><a name="l16145"></a><span class="lineno">16145</span>&#160;                json.BeginString();</div>
+<div class="line"><a name="l16146"></a><span class="lineno">16146</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div>
+<div class="line"><a name="l16147"></a><span class="lineno">16147</span>&#160;                json.EndString();</div>
+<div class="line"><a name="l16148"></a><span class="lineno">16148</span>&#160; </div>
+<div class="line"><a name="l16149"></a><span class="lineno">16149</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div>
+<div class="line"><a name="l16150"></a><span class="lineno">16150</span>&#160;            }</div>
+<div class="line"><a name="l16151"></a><span class="lineno">16151</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l16152"></a><span class="lineno">16152</span>&#160;        }</div>
+<div class="line"><a name="l16153"></a><span class="lineno">16153</span>&#160;    }</div>
+<div class="line"><a name="l16154"></a><span class="lineno">16154</span>&#160;}</div>
+<div class="line"><a name="l16155"></a><span class="lineno">16155</span>&#160; </div>
+<div class="line"><a name="l16156"></a><span class="lineno">16156</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16157"></a><span class="lineno">16157</span>&#160; </div>
+<div class="line"><a name="l16159"></a><span class="lineno">16159</span>&#160;<span class="comment">// Public interface</span></div>
+<div class="line"><a name="l16160"></a><span class="lineno">16160</span>&#160; </div>
+<div class="line"><a name="l16161"></a><span class="lineno">16161</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a>(</div>
+<div class="line"><a name="l16162"></a><span class="lineno">16162</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="l16163"></a><span class="lineno">16163</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div>
+<div class="line"><a name="l16164"></a><span class="lineno">16164</span>&#160;{</div>
+<div class="line"><a name="l16165"></a><span class="lineno">16165</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div>
+<div class="line"><a name="l16166"></a><span class="lineno">16166</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div>
+<div class="line"><a name="l16167"></a><span class="lineno">16167</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="l16168"></a><span class="lineno">16168</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div>
+<div class="line"><a name="l16169"></a><span class="lineno">16169</span>&#160;}</div>
+<div class="line"><a name="l16170"></a><span class="lineno">16170</span>&#160; </div>
+<div class="line"><a name="l16171"></a><span class="lineno">16171</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a>(</div>
+<div class="line"><a name="l16172"></a><span class="lineno">16172</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
+<div class="line"><a name="l16173"></a><span class="lineno">16173</span>&#160;{</div>
+<div class="line"><a name="l16174"></a><span class="lineno">16174</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16175"></a><span class="lineno">16175</span>&#160;    {</div>
+<div class="line"><a name="l16176"></a><span class="lineno">16176</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div>
+<div class="line"><a name="l16177"></a><span class="lineno">16177</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div>
+<div class="line"><a name="l16178"></a><span class="lineno">16178</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div>
+<div class="line"><a name="l16179"></a><span class="lineno">16179</span>&#160;    }</div>
+<div class="line"><a name="l16180"></a><span class="lineno">16180</span>&#160;}</div>
+<div class="line"><a name="l16181"></a><span class="lineno">16181</span>&#160; </div>
+<div class="line"><a name="l16182"></a><span class="lineno">16182</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vmaGetPhysicalDeviceProperties</a>(</div>
+<div class="line"><a name="l16183"></a><span class="lineno">16183</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16184"></a><span class="lineno">16184</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div>
+<div class="line"><a name="l16185"></a><span class="lineno">16185</span>&#160;{</div>
+<div class="line"><a name="l16186"></a><span class="lineno">16186</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div>
+<div class="line"><a name="l16187"></a><span class="lineno">16187</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div>
+<div class="line"><a name="l16188"></a><span class="lineno">16188</span>&#160;}</div>
+<div class="line"><a name="l16189"></a><span class="lineno">16189</span>&#160; </div>
+<div class="line"><a name="l16190"></a><span class="lineno">16190</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties</a>(</div>
+<div class="line"><a name="l16191"></a><span class="lineno">16191</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16192"></a><span class="lineno">16192</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div>
+<div class="line"><a name="l16193"></a><span class="lineno">16193</span>&#160;{</div>
+<div class="line"><a name="l16194"></a><span class="lineno">16194</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l16195"></a><span class="lineno">16195</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div>
+<div class="line"><a name="l16196"></a><span class="lineno">16196</span>&#160;}</div>
+<div class="line"><a name="l16197"></a><span class="lineno">16197</span>&#160; </div>
+<div class="line"><a name="l16198"></a><span class="lineno">16198</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a>(</div>
+<div class="line"><a name="l16199"></a><span class="lineno">16199</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16200"></a><span class="lineno">16200</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l16201"></a><span class="lineno">16201</span>&#160;    VkMemoryPropertyFlags* pFlags)</div>
+<div class="line"><a name="l16202"></a><span class="lineno">16202</span>&#160;{</div>
+<div class="line"><a name="l16203"></a><span class="lineno">16203</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div>
+<div class="line"><a name="l16204"></a><span class="lineno">16204</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div>
+<div class="line"><a name="l16205"></a><span class="lineno">16205</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l16206"></a><span class="lineno">16206</span>&#160;}</div>
+<div class="line"><a name="l16207"></a><span class="lineno">16207</span>&#160; </div>
+<div class="line"><a name="l16208"></a><span class="lineno">16208</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vmaSetCurrentFrameIndex</a>(</div>
+<div class="line"><a name="l16209"></a><span class="lineno">16209</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16210"></a><span class="lineno">16210</span>&#160;    uint32_t frameIndex)</div>
+<div class="line"><a name="l16211"></a><span class="lineno">16211</span>&#160;{</div>
+<div class="line"><a name="l16212"></a><span class="lineno">16212</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16213"></a><span class="lineno">16213</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l16214"></a><span class="lineno">16214</span>&#160; </div>
+<div class="line"><a name="l16215"></a><span class="lineno">16215</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16216"></a><span class="lineno">16216</span>&#160; </div>
+<div class="line"><a name="l16217"></a><span class="lineno">16217</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div>
+<div class="line"><a name="l16218"></a><span class="lineno">16218</span>&#160;}</div>
+<div class="line"><a name="l16219"></a><span class="lineno">16219</span>&#160; </div>
+<div class="line"><a name="l16220"></a><span class="lineno">16220</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vmaCalculateStats</a>(</div>
+<div class="line"><a name="l16221"></a><span class="lineno">16221</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16222"></a><span class="lineno">16222</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l16223"></a><span class="lineno">16223</span>&#160;{</div>
+<div class="line"><a name="l16224"></a><span class="lineno">16224</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div>
+<div class="line"><a name="l16225"></a><span class="lineno">16225</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16226"></a><span class="lineno">16226</span>&#160;    allocator-&gt;CalculateStats(pStats);</div>
+<div class="line"><a name="l16227"></a><span class="lineno">16227</span>&#160;}</div>
+<div class="line"><a name="l16228"></a><span class="lineno">16228</span>&#160; </div>
+<div class="line"><a name="l16229"></a><span class="lineno">16229</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vmaGetBudget</a>(</div>
+<div class="line"><a name="l16230"></a><span class="lineno">16230</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16231"></a><span class="lineno">16231</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget)</div>
+<div class="line"><a name="l16232"></a><span class="lineno">16232</span>&#160;{</div>
+<div class="line"><a name="l16233"></a><span class="lineno">16233</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBudget);</div>
+<div class="line"><a name="l16234"></a><span class="lineno">16234</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16235"></a><span class="lineno">16235</span>&#160;    allocator-&gt;GetBudget(pBudget, 0, allocator-&gt;GetMemoryHeapCount());</div>
+<div class="line"><a name="l16236"></a><span class="lineno">16236</span>&#160;}</div>
+<div class="line"><a name="l16237"></a><span class="lineno">16237</span>&#160; </div>
+<div class="line"><a name="l16238"></a><span class="lineno">16238</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16239"></a><span class="lineno">16239</span>&#160; </div>
+<div class="line"><a name="l16240"></a><span class="lineno">16240</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vmaBuildStatsString</a>(</div>
+<div class="line"><a name="l16241"></a><span class="lineno">16241</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16242"></a><span class="lineno">16242</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div>
+<div class="line"><a name="l16243"></a><span class="lineno">16243</span>&#160;    VkBool32 detailedMap)</div>
+<div class="line"><a name="l16244"></a><span class="lineno">16244</span>&#160;{</div>
+<div class="line"><a name="l16245"></a><span class="lineno">16245</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div>
+<div class="line"><a name="l16246"></a><span class="lineno">16246</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16247"></a><span class="lineno">16247</span>&#160; </div>
+<div class="line"><a name="l16248"></a><span class="lineno">16248</span>&#160;    VmaStringBuilder sb(allocator);</div>
+<div class="line"><a name="l16249"></a><span class="lineno">16249</span>&#160;    {</div>
+<div class="line"><a name="l16250"></a><span class="lineno">16250</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div>
+<div class="line"><a name="l16251"></a><span class="lineno">16251</span>&#160;        json.BeginObject();</div>
+<div class="line"><a name="l16252"></a><span class="lineno">16252</span>&#160; </div>
+<div class="line"><a name="l16253"></a><span class="lineno">16253</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div>
+<div class="line"><a name="l16254"></a><span class="lineno">16254</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div>
+<div class="line"><a name="l16255"></a><span class="lineno">16255</span>&#160; </div>
+<div class="line"><a name="l16256"></a><span class="lineno">16256</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div>
+<div class="line"><a name="l16257"></a><span class="lineno">16257</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l16258"></a><span class="lineno">16258</span>&#160;    </div>
+<div class="line"><a name="l16259"></a><span class="lineno">16259</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l16260"></a><span class="lineno">16260</span>&#160;        {</div>
+<div class="line"><a name="l16261"></a><span class="lineno">16261</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div>
+<div class="line"><a name="l16262"></a><span class="lineno">16262</span>&#160;            json.ContinueString(heapIndex);</div>
+<div class="line"><a name="l16263"></a><span class="lineno">16263</span>&#160;            json.EndString();</div>
+<div class="line"><a name="l16264"></a><span class="lineno">16264</span>&#160;            json.BeginObject();</div>
+<div class="line"><a name="l16265"></a><span class="lineno">16265</span>&#160; </div>
+<div class="line"><a name="l16266"></a><span class="lineno">16266</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l16267"></a><span class="lineno">16267</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l16268"></a><span class="lineno">16268</span>&#160; </div>
+<div class="line"><a name="l16269"></a><span class="lineno">16269</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
+<div class="line"><a name="l16270"></a><span class="lineno">16270</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16271"></a><span class="lineno">16271</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="l16272"></a><span class="lineno">16272</span>&#160;            {</div>
+<div class="line"><a name="l16273"></a><span class="lineno">16273</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
+<div class="line"><a name="l16274"></a><span class="lineno">16274</span>&#160;            }</div>
+<div class="line"><a name="l16275"></a><span class="lineno">16275</span>&#160;            json.EndArray();</div>
+<div class="line"><a name="l16276"></a><span class="lineno">16276</span>&#160; </div>
+<div class="line"><a name="l16277"></a><span class="lineno">16277</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="l16278"></a><span class="lineno">16278</span>&#160;            {</div>
+<div class="line"><a name="l16279"></a><span class="lineno">16279</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
+<div class="line"><a name="l16280"></a><span class="lineno">16280</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div>
+<div class="line"><a name="l16281"></a><span class="lineno">16281</span>&#160;            }</div>
+<div class="line"><a name="l16282"></a><span class="lineno">16282</span>&#160; </div>
+<div class="line"><a name="l16283"></a><span class="lineno">16283</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div>
+<div class="line"><a name="l16284"></a><span class="lineno">16284</span>&#160;            {</div>
+<div class="line"><a name="l16285"></a><span class="lineno">16285</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div>
+<div class="line"><a name="l16286"></a><span class="lineno">16286</span>&#160;                {</div>
+<div class="line"><a name="l16287"></a><span class="lineno">16287</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l16288"></a><span class="lineno">16288</span>&#160;                    json.ContinueString(typeIndex);</div>
+<div class="line"><a name="l16289"></a><span class="lineno">16289</span>&#160;                    json.EndString();</div>
+<div class="line"><a name="l16290"></a><span class="lineno">16290</span>&#160; </div>
+<div class="line"><a name="l16291"></a><span class="lineno">16291</span>&#160;                    json.BeginObject();</div>
+<div class="line"><a name="l16292"></a><span class="lineno">16292</span>&#160; </div>
+<div class="line"><a name="l16293"></a><span class="lineno">16293</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
+<div class="line"><a name="l16294"></a><span class="lineno">16294</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16295"></a><span class="lineno">16295</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div>
+<div class="line"><a name="l16296"></a><span class="lineno">16296</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div>
+<div class="line"><a name="l16297"></a><span class="lineno">16297</span>&#160;                    {</div>
+<div class="line"><a name="l16298"></a><span class="lineno">16298</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
+<div class="line"><a name="l16299"></a><span class="lineno">16299</span>&#160;                    }</div>
+<div class="line"><a name="l16300"></a><span class="lineno">16300</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l16301"></a><span class="lineno">16301</span>&#160;                    {</div>
+<div class="line"><a name="l16302"></a><span class="lineno">16302</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div>
+<div class="line"><a name="l16303"></a><span class="lineno">16303</span>&#160;                    }</div>
+<div class="line"><a name="l16304"></a><span class="lineno">16304</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div>
+<div class="line"><a name="l16305"></a><span class="lineno">16305</span>&#160;                    {</div>
+<div class="line"><a name="l16306"></a><span class="lineno">16306</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div>
+<div class="line"><a name="l16307"></a><span class="lineno">16307</span>&#160;                    }</div>
+<div class="line"><a name="l16308"></a><span class="lineno">16308</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div>
+<div class="line"><a name="l16309"></a><span class="lineno">16309</span>&#160;                    {</div>
+<div class="line"><a name="l16310"></a><span class="lineno">16310</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div>
+<div class="line"><a name="l16311"></a><span class="lineno">16311</span>&#160;                    }</div>
+<div class="line"><a name="l16312"></a><span class="lineno">16312</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div>
+<div class="line"><a name="l16313"></a><span class="lineno">16313</span>&#160;                    {</div>
+<div class="line"><a name="l16314"></a><span class="lineno">16314</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div>
+<div class="line"><a name="l16315"></a><span class="lineno">16315</span>&#160;                    }</div>
+<div class="line"><a name="l16316"></a><span class="lineno">16316</span>&#160;                    json.EndArray();</div>
+<div class="line"><a name="l16317"></a><span class="lineno">16317</span>&#160; </div>
+<div class="line"><a name="l16318"></a><span class="lineno">16318</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="l16319"></a><span class="lineno">16319</span>&#160;                    {</div>
+<div class="line"><a name="l16320"></a><span class="lineno">16320</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
+<div class="line"><a name="l16321"></a><span class="lineno">16321</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div>
+<div class="line"><a name="l16322"></a><span class="lineno">16322</span>&#160;                    }</div>
+<div class="line"><a name="l16323"></a><span class="lineno">16323</span>&#160; </div>
+<div class="line"><a name="l16324"></a><span class="lineno">16324</span>&#160;                    json.EndObject();</div>
+<div class="line"><a name="l16325"></a><span class="lineno">16325</span>&#160;                }</div>
+<div class="line"><a name="l16326"></a><span class="lineno">16326</span>&#160;            }</div>
+<div class="line"><a name="l16327"></a><span class="lineno">16327</span>&#160; </div>
+<div class="line"><a name="l16328"></a><span class="lineno">16328</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l16329"></a><span class="lineno">16329</span>&#160;        }</div>
+<div class="line"><a name="l16330"></a><span class="lineno">16330</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div>
+<div class="line"><a name="l16331"></a><span class="lineno">16331</span>&#160;        {</div>
+<div class="line"><a name="l16332"></a><span class="lineno">16332</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div>
+<div class="line"><a name="l16333"></a><span class="lineno">16333</span>&#160;        }</div>
+<div class="line"><a name="l16334"></a><span class="lineno">16334</span>&#160; </div>
+<div class="line"><a name="l16335"></a><span class="lineno">16335</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l16336"></a><span class="lineno">16336</span>&#160;    }</div>
+<div class="line"><a name="l16337"></a><span class="lineno">16337</span>&#160; </div>
+<div class="line"><a name="l16338"></a><span class="lineno">16338</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div>
+<div class="line"><a name="l16339"></a><span class="lineno">16339</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="l16340"></a><span class="lineno">16340</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div>
+<div class="line"><a name="l16341"></a><span class="lineno">16341</span>&#160;    {</div>
+<div class="line"><a name="l16342"></a><span class="lineno">16342</span>&#160;        memcpy(pChars, sb.GetData(), len);</div>
+<div class="line"><a name="l16343"></a><span class="lineno">16343</span>&#160;    }</div>
+<div class="line"><a name="l16344"></a><span class="lineno">16344</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l16345"></a><span class="lineno">16345</span>&#160;    *ppStatsString = pChars;</div>
+<div class="line"><a name="l16346"></a><span class="lineno">16346</span>&#160;}</div>
+<div class="line"><a name="l16347"></a><span class="lineno">16347</span>&#160; </div>
+<div class="line"><a name="l16348"></a><span class="lineno">16348</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString</a>(</div>
+<div class="line"><a name="l16349"></a><span class="lineno">16349</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16350"></a><span class="lineno">16350</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div>
+<div class="line"><a name="l16351"></a><span class="lineno">16351</span>&#160;{</div>
+<div class="line"><a name="l16352"></a><span class="lineno">16352</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div>
+<div class="line"><a name="l16353"></a><span class="lineno">16353</span>&#160;    {</div>
+<div class="line"><a name="l16354"></a><span class="lineno">16354</span>&#160;        VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16355"></a><span class="lineno">16355</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div>
+<div class="line"><a name="l16356"></a><span class="lineno">16356</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div>
+<div class="line"><a name="l16357"></a><span class="lineno">16357</span>&#160;    }</div>
+<div class="line"><a name="l16358"></a><span class="lineno">16358</span>&#160;}</div>
+<div class="line"><a name="l16359"></a><span class="lineno">16359</span>&#160; </div>
+<div class="line"><a name="l16360"></a><span class="lineno">16360</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16361"></a><span class="lineno">16361</span>&#160; </div>
+<div class="line"><a name="l16362"></a><span class="lineno">16362</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l16363"></a><span class="lineno">16363</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="l16364"></a><span class="lineno">16364</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l16365"></a><span class="lineno">16365</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16366"></a><span class="lineno">16366</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16367"></a><span class="lineno">16367</span>&#160;    uint32_t memoryTypeBits,</div>
+<div class="line"><a name="l16368"></a><span class="lineno">16368</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="l16369"></a><span class="lineno">16369</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16370"></a><span class="lineno">16370</span>&#160;{</div>
+<div class="line"><a name="l16371"></a><span class="lineno">16371</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16372"></a><span class="lineno">16372</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16373"></a><span class="lineno">16373</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16374"></a><span class="lineno">16374</span>&#160; </div>
+<div class="line"><a name="l16375"></a><span class="lineno">16375</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="l16376"></a><span class="lineno">16376</span>&#160;    {</div>
+<div class="line"><a name="l16377"></a><span class="lineno">16377</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="l16378"></a><span class="lineno">16378</span>&#160;    }</div>
+<div class="line"><a name="l16379"></a><span class="lineno">16379</span>&#160;    </div>
+<div class="line"><a name="l16380"></a><span class="lineno">16380</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="l16381"></a><span class="lineno">16381</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="l16382"></a><span class="lineno">16382</span>&#160; </div>
+<div class="line"><a name="l16383"></a><span class="lineno">16383</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div>
+<div class="line"><a name="l16384"></a><span class="lineno">16384</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="l16385"></a><span class="lineno">16385</span>&#160;    {</div>
+<div class="line"><a name="l16386"></a><span class="lineno">16386</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="l16387"></a><span class="lineno">16387</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16388"></a><span class="lineno">16388</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="l16389"></a><span class="lineno">16389</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="l16390"></a><span class="lineno">16390</span>&#160;        {</div>
+<div class="line"><a name="l16391"></a><span class="lineno">16391</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l16392"></a><span class="lineno">16392</span>&#160;        }</div>
+<div class="line"><a name="l16393"></a><span class="lineno">16393</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16394"></a><span class="lineno">16394</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="l16395"></a><span class="lineno">16395</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
+<div class="line"><a name="l16396"></a><span class="lineno">16396</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16397"></a><span class="lineno">16397</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="l16398"></a><span class="lineno">16398</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l16399"></a><span class="lineno">16399</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="l16400"></a><span class="lineno">16400</span>&#160;        {</div>
+<div class="line"><a name="l16401"></a><span class="lineno">16401</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l16402"></a><span class="lineno">16402</span>&#160;        }</div>
+<div class="line"><a name="l16403"></a><span class="lineno">16403</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16404"></a><span class="lineno">16404</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="l16405"></a><span class="lineno">16405</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l16406"></a><span class="lineno">16406</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
+<div class="line"><a name="l16407"></a><span class="lineno">16407</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16408"></a><span class="lineno">16408</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16409"></a><span class="lineno">16409</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16410"></a><span class="lineno">16410</span>&#160;    }</div>
+<div class="line"><a name="l16411"></a><span class="lineno">16411</span>&#160; </div>
+<div class="line"><a name="l16412"></a><span class="lineno">16412</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l16413"></a><span class="lineno">16413</span>&#160;    uint32_t minCost = UINT32_MAX;</div>
+<div class="line"><a name="l16414"></a><span class="lineno">16414</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div>
+<div class="line"><a name="l16415"></a><span class="lineno">16415</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div>
+<div class="line"><a name="l16416"></a><span class="lineno">16416</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div>
+<div class="line"><a name="l16417"></a><span class="lineno">16417</span>&#160;    {</div>
+<div class="line"><a name="l16418"></a><span class="lineno">16418</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div>
+<div class="line"><a name="l16419"></a><span class="lineno">16419</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div>
+<div class="line"><a name="l16420"></a><span class="lineno">16420</span>&#160;        {</div>
+<div class="line"><a name="l16421"></a><span class="lineno">16421</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div>
+<div class="line"><a name="l16422"></a><span class="lineno">16422</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l16423"></a><span class="lineno">16423</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div>
+<div class="line"><a name="l16424"></a><span class="lineno">16424</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div>
+<div class="line"><a name="l16425"></a><span class="lineno">16425</span>&#160;            {</div>
+<div class="line"><a name="l16426"></a><span class="lineno">16426</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="l16427"></a><span class="lineno">16427</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div>
+<div class="line"><a name="l16428"></a><span class="lineno">16428</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div>
+<div class="line"><a name="l16429"></a><span class="lineno">16429</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div>
+<div class="line"><a name="l16430"></a><span class="lineno">16430</span>&#160;                {</div>
+<div class="line"><a name="l16431"></a><span class="lineno">16431</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l16432"></a><span class="lineno">16432</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div>
+<div class="line"><a name="l16433"></a><span class="lineno">16433</span>&#160;                    {</div>
+<div class="line"><a name="l16434"></a><span class="lineno">16434</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16435"></a><span class="lineno">16435</span>&#160;                    }</div>
+<div class="line"><a name="l16436"></a><span class="lineno">16436</span>&#160;                    minCost = currCost;</div>
+<div class="line"><a name="l16437"></a><span class="lineno">16437</span>&#160;                }</div>
+<div class="line"><a name="l16438"></a><span class="lineno">16438</span>&#160;            }</div>
+<div class="line"><a name="l16439"></a><span class="lineno">16439</span>&#160;        }</div>
+<div class="line"><a name="l16440"></a><span class="lineno">16440</span>&#160;    }</div>
+<div class="line"><a name="l16441"></a><span class="lineno">16441</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l16442"></a><span class="lineno">16442</span>&#160;}</div>
+<div class="line"><a name="l16443"></a><span class="lineno">16443</span>&#160; </div>
+<div class="line"><a name="l16444"></a><span class="lineno">16444</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
+<div class="line"><a name="l16445"></a><span class="lineno">16445</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16446"></a><span class="lineno">16446</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l16447"></a><span class="lineno">16447</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="l16448"></a><span class="lineno">16448</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16449"></a><span class="lineno">16449</span>&#160;{</div>
+<div class="line"><a name="l16450"></a><span class="lineno">16450</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16451"></a><span class="lineno">16451</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16452"></a><span class="lineno">16452</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16453"></a><span class="lineno">16453</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16454"></a><span class="lineno">16454</span>&#160; </div>
+<div class="line"><a name="l16455"></a><span class="lineno">16455</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
+<div class="line"><a name="l16456"></a><span class="lineno">16456</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16457"></a><span class="lineno">16457</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div>
+<div class="line"><a name="l16458"></a><span class="lineno">16458</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div>
+<div class="line"><a name="l16459"></a><span class="lineno">16459</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16460"></a><span class="lineno">16460</span>&#160;    {</div>
+<div class="line"><a name="l16461"></a><span class="lineno">16461</span>&#160;        VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l16462"></a><span class="lineno">16462</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div>
+<div class="line"><a name="l16463"></a><span class="lineno">16463</span>&#160;            hDev, hBuffer, &amp;memReq);</div>
+<div class="line"><a name="l16464"></a><span class="lineno">16464</span>&#160; </div>
+<div class="line"><a name="l16465"></a><span class="lineno">16465</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16466"></a><span class="lineno">16466</span>&#160;            allocator,</div>
+<div class="line"><a name="l16467"></a><span class="lineno">16467</span>&#160;            memReq.memoryTypeBits,</div>
+<div class="line"><a name="l16468"></a><span class="lineno">16468</span>&#160;            pAllocationCreateInfo,</div>
+<div class="line"><a name="l16469"></a><span class="lineno">16469</span>&#160;            pMemoryTypeIndex);</div>
+<div class="line"><a name="l16470"></a><span class="lineno">16470</span>&#160; </div>
+<div class="line"><a name="l16471"></a><span class="lineno">16471</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div>
+<div class="line"><a name="l16472"></a><span class="lineno">16472</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l16473"></a><span class="lineno">16473</span>&#160;    }</div>
+<div class="line"><a name="l16474"></a><span class="lineno">16474</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16475"></a><span class="lineno">16475</span>&#160;}</div>
+<div class="line"><a name="l16476"></a><span class="lineno">16476</span>&#160; </div>
+<div class="line"><a name="l16477"></a><span class="lineno">16477</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
+<div class="line"><a name="l16478"></a><span class="lineno">16478</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16479"></a><span class="lineno">16479</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l16480"></a><span class="lineno">16480</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="l16481"></a><span class="lineno">16481</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16482"></a><span class="lineno">16482</span>&#160;{</div>
+<div class="line"><a name="l16483"></a><span class="lineno">16483</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16484"></a><span class="lineno">16484</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16485"></a><span class="lineno">16485</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16486"></a><span class="lineno">16486</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16487"></a><span class="lineno">16487</span>&#160; </div>
+<div class="line"><a name="l16488"></a><span class="lineno">16488</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
+<div class="line"><a name="l16489"></a><span class="lineno">16489</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16490"></a><span class="lineno">16490</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div>
+<div class="line"><a name="l16491"></a><span class="lineno">16491</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div>
+<div class="line"><a name="l16492"></a><span class="lineno">16492</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16493"></a><span class="lineno">16493</span>&#160;    {</div>
+<div class="line"><a name="l16494"></a><span class="lineno">16494</span>&#160;        VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l16495"></a><span class="lineno">16495</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div>
+<div class="line"><a name="l16496"></a><span class="lineno">16496</span>&#160;            hDev, hImage, &amp;memReq);</div>
+<div class="line"><a name="l16497"></a><span class="lineno">16497</span>&#160; </div>
+<div class="line"><a name="l16498"></a><span class="lineno">16498</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16499"></a><span class="lineno">16499</span>&#160;            allocator,</div>
+<div class="line"><a name="l16500"></a><span class="lineno">16500</span>&#160;            memReq.memoryTypeBits,</div>
+<div class="line"><a name="l16501"></a><span class="lineno">16501</span>&#160;            pAllocationCreateInfo,</div>
+<div class="line"><a name="l16502"></a><span class="lineno">16502</span>&#160;            pMemoryTypeIndex);</div>
+<div class="line"><a name="l16503"></a><span class="lineno">16503</span>&#160; </div>
+<div class="line"><a name="l16504"></a><span class="lineno">16504</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div>
+<div class="line"><a name="l16505"></a><span class="lineno">16505</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l16506"></a><span class="lineno">16506</span>&#160;    }</div>
+<div class="line"><a name="l16507"></a><span class="lineno">16507</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16508"></a><span class="lineno">16508</span>&#160;}</div>
+<div class="line"><a name="l16509"></a><span class="lineno">16509</span>&#160; </div>
+<div class="line"><a name="l16510"></a><span class="lineno">16510</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a>(</div>
+<div class="line"><a name="l16511"></a><span class="lineno">16511</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16512"></a><span class="lineno">16512</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="l16513"></a><span class="lineno">16513</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
+<div class="line"><a name="l16514"></a><span class="lineno">16514</span>&#160;{</div>
+<div class="line"><a name="l16515"></a><span class="lineno">16515</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div>
+<div class="line"><a name="l16516"></a><span class="lineno">16516</span>&#160;    </div>
+<div class="line"><a name="l16517"></a><span class="lineno">16517</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div>
+<div class="line"><a name="l16518"></a><span class="lineno">16518</span>&#160;    </div>
+<div class="line"><a name="l16519"></a><span class="lineno">16519</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16520"></a><span class="lineno">16520</span>&#160;    </div>
+<div class="line"><a name="l16521"></a><span class="lineno">16521</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div>
+<div class="line"><a name="l16522"></a><span class="lineno">16522</span>&#160;    </div>
+<div class="line"><a name="l16523"></a><span class="lineno">16523</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16524"></a><span class="lineno">16524</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16525"></a><span class="lineno">16525</span>&#160;    {</div>
+<div class="line"><a name="l16526"></a><span class="lineno">16526</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div>
+<div class="line"><a name="l16527"></a><span class="lineno">16527</span>&#160;    }</div>
+<div class="line"><a name="l16528"></a><span class="lineno">16528</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16529"></a><span class="lineno">16529</span>&#160;    </div>
+<div class="line"><a name="l16530"></a><span class="lineno">16530</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16531"></a><span class="lineno">16531</span>&#160;}</div>
+<div class="line"><a name="l16532"></a><span class="lineno">16532</span>&#160; </div>
+<div class="line"><a name="l16533"></a><span class="lineno">16533</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a>(</div>
+<div class="line"><a name="l16534"></a><span class="lineno">16534</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16535"></a><span class="lineno">16535</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l16536"></a><span class="lineno">16536</span>&#160;{</div>
+<div class="line"><a name="l16537"></a><span class="lineno">16537</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16538"></a><span class="lineno">16538</span>&#160;    </div>
+<div class="line"><a name="l16539"></a><span class="lineno">16539</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16540"></a><span class="lineno">16540</span>&#160;    {</div>
+<div class="line"><a name="l16541"></a><span class="lineno">16541</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l16542"></a><span class="lineno">16542</span>&#160;    }</div>
+<div class="line"><a name="l16543"></a><span class="lineno">16543</span>&#160;    </div>
+<div class="line"><a name="l16544"></a><span class="lineno">16544</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div>
+<div class="line"><a name="l16545"></a><span class="lineno">16545</span>&#160;    </div>
+<div class="line"><a name="l16546"></a><span class="lineno">16546</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16547"></a><span class="lineno">16547</span>&#160;    </div>
+<div class="line"><a name="l16548"></a><span class="lineno">16548</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16549"></a><span class="lineno">16549</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16550"></a><span class="lineno">16550</span>&#160;    {</div>
+<div class="line"><a name="l16551"></a><span class="lineno">16551</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l16552"></a><span class="lineno">16552</span>&#160;    }</div>
+<div class="line"><a name="l16553"></a><span class="lineno">16553</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16554"></a><span class="lineno">16554</span>&#160; </div>
+<div class="line"><a name="l16555"></a><span class="lineno">16555</span>&#160;    allocator-&gt;DestroyPool(pool);</div>
+<div class="line"><a name="l16556"></a><span class="lineno">16556</span>&#160;}</div>
+<div class="line"><a name="l16557"></a><span class="lineno">16557</span>&#160; </div>
+<div class="line"><a name="l16558"></a><span class="lineno">16558</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vmaGetPoolStats</a>(</div>
+<div class="line"><a name="l16559"></a><span class="lineno">16559</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16560"></a><span class="lineno">16560</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16561"></a><span class="lineno">16561</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
+<div class="line"><a name="l16562"></a><span class="lineno">16562</span>&#160;{</div>
+<div class="line"><a name="l16563"></a><span class="lineno">16563</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div>
+<div class="line"><a name="l16564"></a><span class="lineno">16564</span>&#160; </div>
+<div class="line"><a name="l16565"></a><span class="lineno">16565</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16566"></a><span class="lineno">16566</span>&#160; </div>
+<div class="line"><a name="l16567"></a><span class="lineno">16567</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div>
+<div class="line"><a name="l16568"></a><span class="lineno">16568</span>&#160;}</div>
+<div class="line"><a name="l16569"></a><span class="lineno">16569</span>&#160; </div>
+<div class="line"><a name="l16570"></a><span class="lineno">16570</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vmaMakePoolAllocationsLost</a>(</div>
+<div class="line"><a name="l16571"></a><span class="lineno">16571</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16572"></a><span class="lineno">16572</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16573"></a><span class="lineno">16573</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l16574"></a><span class="lineno">16574</span>&#160;{</div>
+<div class="line"><a name="l16575"></a><span class="lineno">16575</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
+<div class="line"><a name="l16576"></a><span class="lineno">16576</span>&#160; </div>
+<div class="line"><a name="l16577"></a><span class="lineno">16577</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16578"></a><span class="lineno">16578</span>&#160; </div>
+<div class="line"><a name="l16579"></a><span class="lineno">16579</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16580"></a><span class="lineno">16580</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16581"></a><span class="lineno">16581</span>&#160;    {</div>
+<div class="line"><a name="l16582"></a><span class="lineno">16582</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l16583"></a><span class="lineno">16583</span>&#160;    }</div>
+<div class="line"><a name="l16584"></a><span class="lineno">16584</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16585"></a><span class="lineno">16585</span>&#160; </div>
+<div class="line"><a name="l16586"></a><span class="lineno">16586</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div>
+<div class="line"><a name="l16587"></a><span class="lineno">16587</span>&#160;}</div>
+<div class="line"><a name="l16588"></a><span class="lineno">16588</span>&#160; </div>
+<div class="line"><a name="l16589"></a><span class="lineno">16589</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">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="l16590"></a><span class="lineno">16590</span>&#160;{</div>
+<div class="line"><a name="l16591"></a><span class="lineno">16591</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
+<div class="line"><a name="l16592"></a><span class="lineno">16592</span>&#160; </div>
+<div class="line"><a name="l16593"></a><span class="lineno">16593</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16594"></a><span class="lineno">16594</span>&#160; </div>
+<div class="line"><a name="l16595"></a><span class="lineno">16595</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div>
+<div class="line"><a name="l16596"></a><span class="lineno">16596</span>&#160; </div>
+<div class="line"><a name="l16597"></a><span class="lineno">16597</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div>
+<div class="line"><a name="l16598"></a><span class="lineno">16598</span>&#160;}</div>
+<div class="line"><a name="l16599"></a><span class="lineno">16599</span>&#160; </div>
+<div class="line"><a name="l16600"></a><span class="lineno">16600</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vmaAllocateMemory</a>(</div>
+<div class="line"><a name="l16601"></a><span class="lineno">16601</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16602"></a><span class="lineno">16602</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l16603"></a><span class="lineno">16603</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="l16604"></a><span class="lineno">16604</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l16605"></a><span class="lineno">16605</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16606"></a><span class="lineno">16606</span>&#160;{</div>
+<div class="line"><a name="l16607"></a><span class="lineno">16607</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l16608"></a><span class="lineno">16608</span>&#160; </div>
+<div class="line"><a name="l16609"></a><span class="lineno">16609</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div>
+<div class="line"><a name="l16610"></a><span class="lineno">16610</span>&#160; </div>
+<div class="line"><a name="l16611"></a><span class="lineno">16611</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16612"></a><span class="lineno">16612</span>&#160; </div>
+<div class="line"><a name="l16613"></a><span class="lineno">16613</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l16614"></a><span class="lineno">16614</span>&#160;        *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16615"></a><span class="lineno">16615</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l16616"></a><span class="lineno">16616</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l16617"></a><span class="lineno">16617</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16618"></a><span class="lineno">16618</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16619"></a><span class="lineno">16619</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l16620"></a><span class="lineno">16620</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l16621"></a><span class="lineno">16621</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16622"></a><span class="lineno">16622</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l16623"></a><span class="lineno">16623</span>&#160; </div>
+<div class="line"><a name="l16624"></a><span class="lineno">16624</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16625"></a><span class="lineno">16625</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16626"></a><span class="lineno">16626</span>&#160;    {</div>
+<div class="line"><a name="l16627"></a><span class="lineno">16627</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div>
+<div class="line"><a name="l16628"></a><span class="lineno">16628</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16629"></a><span class="lineno">16629</span>&#160;            *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16630"></a><span class="lineno">16630</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l16631"></a><span class="lineno">16631</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l16632"></a><span class="lineno">16632</span>&#160;    }</div>
+<div class="line"><a name="l16633"></a><span class="lineno">16633</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16634"></a><span class="lineno">16634</span>&#160;        </div>
+<div class="line"><a name="l16635"></a><span class="lineno">16635</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l16636"></a><span class="lineno">16636</span>&#160;    {</div>
+<div class="line"><a name="l16637"></a><span class="lineno">16637</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16638"></a><span class="lineno">16638</span>&#160;    }</div>
+<div class="line"><a name="l16639"></a><span class="lineno">16639</span>&#160; </div>
+<div class="line"><a name="l16640"></a><span class="lineno">16640</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16641"></a><span class="lineno">16641</span>&#160;}</div>
+<div class="line"><a name="l16642"></a><span class="lineno">16642</span>&#160; </div>
+<div class="line"><a name="l16643"></a><span class="lineno">16643</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vmaAllocateMemoryPages</a>(</div>
+<div class="line"><a name="l16644"></a><span class="lineno">16644</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16645"></a><span class="lineno">16645</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l16646"></a><span class="lineno">16646</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="l16647"></a><span class="lineno">16647</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16648"></a><span class="lineno">16648</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l16649"></a><span class="lineno">16649</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16650"></a><span class="lineno">16650</span>&#160;{</div>
+<div class="line"><a name="l16651"></a><span class="lineno">16651</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l16652"></a><span class="lineno">16652</span>&#160;    {</div>
+<div class="line"><a name="l16653"></a><span class="lineno">16653</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16654"></a><span class="lineno">16654</span>&#160;    }</div>
+<div class="line"><a name="l16655"></a><span class="lineno">16655</span>&#160; </div>
+<div class="line"><a name="l16656"></a><span class="lineno">16656</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocations);</div>
+<div class="line"><a name="l16657"></a><span class="lineno">16657</span>&#160; </div>
+<div class="line"><a name="l16658"></a><span class="lineno">16658</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryPages&quot;</span>);</div>
+<div class="line"><a name="l16659"></a><span class="lineno">16659</span>&#160; </div>
+<div class="line"><a name="l16660"></a><span class="lineno">16660</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16661"></a><span class="lineno">16661</span>&#160; </div>
+<div class="line"><a name="l16662"></a><span class="lineno">16662</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l16663"></a><span class="lineno">16663</span>&#160;        *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16664"></a><span class="lineno">16664</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l16665"></a><span class="lineno">16665</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l16666"></a><span class="lineno">16666</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16667"></a><span class="lineno">16667</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16668"></a><span class="lineno">16668</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l16669"></a><span class="lineno">16669</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l16670"></a><span class="lineno">16670</span>&#160;        allocationCount,</div>
+<div class="line"><a name="l16671"></a><span class="lineno">16671</span>&#160;        pAllocations);</div>
+<div class="line"><a name="l16672"></a><span class="lineno">16672</span>&#160; </div>
+<div class="line"><a name="l16673"></a><span class="lineno">16673</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16674"></a><span class="lineno">16674</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16675"></a><span class="lineno">16675</span>&#160;    {</div>
+<div class="line"><a name="l16676"></a><span class="lineno">16676</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryPages(</div>
+<div class="line"><a name="l16677"></a><span class="lineno">16677</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16678"></a><span class="lineno">16678</span>&#160;            *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16679"></a><span class="lineno">16679</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l16680"></a><span class="lineno">16680</span>&#160;            (uint64_t)allocationCount,</div>
+<div class="line"><a name="l16681"></a><span class="lineno">16681</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l16682"></a><span class="lineno">16682</span>&#160;    }</div>
+<div class="line"><a name="l16683"></a><span class="lineno">16683</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16684"></a><span class="lineno">16684</span>&#160;        </div>
+<div class="line"><a name="l16685"></a><span class="lineno">16685</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l16686"></a><span class="lineno">16686</span>&#160;    {</div>
+<div class="line"><a name="l16687"></a><span class="lineno">16687</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocationCount; ++i)</div>
+<div class="line"><a name="l16688"></a><span class="lineno">16688</span>&#160;        {</div>
+<div class="line"><a name="l16689"></a><span class="lineno">16689</span>&#160;            allocator-&gt;GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div>
+<div class="line"><a name="l16690"></a><span class="lineno">16690</span>&#160;        }</div>
+<div class="line"><a name="l16691"></a><span class="lineno">16691</span>&#160;    }</div>
+<div class="line"><a name="l16692"></a><span class="lineno">16692</span>&#160; </div>
+<div class="line"><a name="l16693"></a><span class="lineno">16693</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16694"></a><span class="lineno">16694</span>&#160;}</div>
+<div class="line"><a name="l16695"></a><span class="lineno">16695</span>&#160; </div>
+<div class="line"><a name="l16696"></a><span class="lineno">16696</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer</a>(</div>
+<div class="line"><a name="l16697"></a><span class="lineno">16697</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16698"></a><span class="lineno">16698</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l16699"></a><span class="lineno">16699</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="l16700"></a><span class="lineno">16700</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l16701"></a><span class="lineno">16701</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16702"></a><span class="lineno">16702</span>&#160;{</div>
+<div class="line"><a name="l16703"></a><span class="lineno">16703</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l16704"></a><span class="lineno">16704</span>&#160; </div>
+<div class="line"><a name="l16705"></a><span class="lineno">16705</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div>
+<div class="line"><a name="l16706"></a><span class="lineno">16706</span>&#160; </div>
+<div class="line"><a name="l16707"></a><span class="lineno">16707</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16708"></a><span class="lineno">16708</span>&#160; </div>
+<div class="line"><a name="l16709"></a><span class="lineno">16709</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l16710"></a><span class="lineno">16710</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16711"></a><span class="lineno">16711</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16712"></a><span class="lineno">16712</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div>
+<div class="line"><a name="l16713"></a><span class="lineno">16713</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16714"></a><span class="lineno">16714</span>&#160;        prefersDedicatedAllocation);</div>
+<div class="line"><a name="l16715"></a><span class="lineno">16715</span>&#160; </div>
+<div class="line"><a name="l16716"></a><span class="lineno">16716</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l16717"></a><span class="lineno">16717</span>&#160;        vkMemReq,</div>
+<div class="line"><a name="l16718"></a><span class="lineno">16718</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16719"></a><span class="lineno">16719</span>&#160;        prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16720"></a><span class="lineno">16720</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16721"></a><span class="lineno">16721</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16722"></a><span class="lineno">16722</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l16723"></a><span class="lineno">16723</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l16724"></a><span class="lineno">16724</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16725"></a><span class="lineno">16725</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l16726"></a><span class="lineno">16726</span>&#160; </div>
+<div class="line"><a name="l16727"></a><span class="lineno">16727</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16728"></a><span class="lineno">16728</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16729"></a><span class="lineno">16729</span>&#160;    {</div>
+<div class="line"><a name="l16730"></a><span class="lineno">16730</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div>
+<div class="line"><a name="l16731"></a><span class="lineno">16731</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16732"></a><span class="lineno">16732</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l16733"></a><span class="lineno">16733</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16734"></a><span class="lineno">16734</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16735"></a><span class="lineno">16735</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l16736"></a><span class="lineno">16736</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l16737"></a><span class="lineno">16737</span>&#160;    }</div>
+<div class="line"><a name="l16738"></a><span class="lineno">16738</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16739"></a><span class="lineno">16739</span>&#160; </div>
+<div class="line"><a name="l16740"></a><span class="lineno">16740</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l16741"></a><span class="lineno">16741</span>&#160;    {</div>
+<div class="line"><a name="l16742"></a><span class="lineno">16742</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16743"></a><span class="lineno">16743</span>&#160;    }</div>
+<div class="line"><a name="l16744"></a><span class="lineno">16744</span>&#160; </div>
+<div class="line"><a name="l16745"></a><span class="lineno">16745</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16746"></a><span class="lineno">16746</span>&#160;}</div>
+<div class="line"><a name="l16747"></a><span class="lineno">16747</span>&#160; </div>
+<div class="line"><a name="l16748"></a><span class="lineno">16748</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vmaAllocateMemoryForImage</a>(</div>
+<div class="line"><a name="l16749"></a><span class="lineno">16749</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16750"></a><span class="lineno">16750</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l16751"></a><span class="lineno">16751</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="l16752"></a><span class="lineno">16752</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l16753"></a><span class="lineno">16753</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16754"></a><span class="lineno">16754</span>&#160;{</div>
+<div class="line"><a name="l16755"></a><span class="lineno">16755</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l16756"></a><span class="lineno">16756</span>&#160; </div>
+<div class="line"><a name="l16757"></a><span class="lineno">16757</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div>
+<div class="line"><a name="l16758"></a><span class="lineno">16758</span>&#160; </div>
+<div class="line"><a name="l16759"></a><span class="lineno">16759</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16760"></a><span class="lineno">16760</span>&#160; </div>
+<div class="line"><a name="l16761"></a><span class="lineno">16761</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l16762"></a><span class="lineno">16762</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16763"></a><span class="lineno">16763</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16764"></a><span class="lineno">16764</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div>
+<div class="line"><a name="l16765"></a><span class="lineno">16765</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l16766"></a><span class="lineno">16766</span>&#160; </div>
+<div class="line"><a name="l16767"></a><span class="lineno">16767</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l16768"></a><span class="lineno">16768</span>&#160;        vkMemReq,</div>
+<div class="line"><a name="l16769"></a><span class="lineno">16769</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16770"></a><span class="lineno">16770</span>&#160;        prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16771"></a><span class="lineno">16771</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16772"></a><span class="lineno">16772</span>&#160;        image, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16773"></a><span class="lineno">16773</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l16774"></a><span class="lineno">16774</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div>
+<div class="line"><a name="l16775"></a><span class="lineno">16775</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16776"></a><span class="lineno">16776</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l16777"></a><span class="lineno">16777</span>&#160; </div>
+<div class="line"><a name="l16778"></a><span class="lineno">16778</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16779"></a><span class="lineno">16779</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16780"></a><span class="lineno">16780</span>&#160;    {</div>
+<div class="line"><a name="l16781"></a><span class="lineno">16781</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div>
+<div class="line"><a name="l16782"></a><span class="lineno">16782</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16783"></a><span class="lineno">16783</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l16784"></a><span class="lineno">16784</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16785"></a><span class="lineno">16785</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16786"></a><span class="lineno">16786</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l16787"></a><span class="lineno">16787</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l16788"></a><span class="lineno">16788</span>&#160;    }</div>
+<div class="line"><a name="l16789"></a><span class="lineno">16789</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16790"></a><span class="lineno">16790</span>&#160; </div>
+<div class="line"><a name="l16791"></a><span class="lineno">16791</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l16792"></a><span class="lineno">16792</span>&#160;    {</div>
+<div class="line"><a name="l16793"></a><span class="lineno">16793</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16794"></a><span class="lineno">16794</span>&#160;    }</div>
+<div class="line"><a name="l16795"></a><span class="lineno">16795</span>&#160; </div>
+<div class="line"><a name="l16796"></a><span class="lineno">16796</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16797"></a><span class="lineno">16797</span>&#160;}</div>
+<div class="line"><a name="l16798"></a><span class="lineno">16798</span>&#160; </div>
+<div class="line"><a name="l16799"></a><span class="lineno">16799</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a>(</div>
+<div class="line"><a name="l16800"></a><span class="lineno">16800</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16801"></a><span class="lineno">16801</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l16802"></a><span class="lineno">16802</span>&#160;{</div>
+<div class="line"><a name="l16803"></a><span class="lineno">16803</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16804"></a><span class="lineno">16804</span>&#160;    </div>
+<div class="line"><a name="l16805"></a><span class="lineno">16805</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16806"></a><span class="lineno">16806</span>&#160;    {</div>
+<div class="line"><a name="l16807"></a><span class="lineno">16807</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l16808"></a><span class="lineno">16808</span>&#160;    }</div>
+<div class="line"><a name="l16809"></a><span class="lineno">16809</span>&#160;    </div>
+<div class="line"><a name="l16810"></a><span class="lineno">16810</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div>
+<div class="line"><a name="l16811"></a><span class="lineno">16811</span>&#160;    </div>
+<div class="line"><a name="l16812"></a><span class="lineno">16812</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16813"></a><span class="lineno">16813</span>&#160; </div>
+<div class="line"><a name="l16814"></a><span class="lineno">16814</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16815"></a><span class="lineno">16815</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16816"></a><span class="lineno">16816</span>&#160;    {</div>
+<div class="line"><a name="l16817"></a><span class="lineno">16817</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div>
+<div class="line"><a name="l16818"></a><span class="lineno">16818</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16819"></a><span class="lineno">16819</span>&#160;            allocation);</div>
+<div class="line"><a name="l16820"></a><span class="lineno">16820</span>&#160;    }</div>
+<div class="line"><a name="l16821"></a><span class="lineno">16821</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16822"></a><span class="lineno">16822</span>&#160;    </div>
+<div class="line"><a name="l16823"></a><span class="lineno">16823</span>&#160;    allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l16824"></a><span class="lineno">16824</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16825"></a><span class="lineno">16825</span>&#160;        &amp;allocation);</div>
+<div class="line"><a name="l16826"></a><span class="lineno">16826</span>&#160;}</div>
+<div class="line"><a name="l16827"></a><span class="lineno">16827</span>&#160; </div>
+<div class="line"><a name="l16828"></a><span class="lineno">16828</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l16829"></a><span class="lineno">16829</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16830"></a><span class="lineno">16830</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16831"></a><span class="lineno">16831</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16832"></a><span class="lineno">16832</span>&#160;{</div>
+<div class="line"><a name="l16833"></a><span class="lineno">16833</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l16834"></a><span class="lineno">16834</span>&#160;    {</div>
+<div class="line"><a name="l16835"></a><span class="lineno">16835</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l16836"></a><span class="lineno">16836</span>&#160;    }</div>
+<div class="line"><a name="l16837"></a><span class="lineno">16837</span>&#160; </div>
+<div class="line"><a name="l16838"></a><span class="lineno">16838</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16839"></a><span class="lineno">16839</span>&#160;    </div>
+<div class="line"><a name="l16840"></a><span class="lineno">16840</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemoryPages&quot;</span>);</div>
+<div class="line"><a name="l16841"></a><span class="lineno">16841</span>&#160;    </div>
+<div class="line"><a name="l16842"></a><span class="lineno">16842</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16843"></a><span class="lineno">16843</span>&#160; </div>
+<div class="line"><a name="l16844"></a><span class="lineno">16844</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16845"></a><span class="lineno">16845</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16846"></a><span class="lineno">16846</span>&#160;    {</div>
+<div class="line"><a name="l16847"></a><span class="lineno">16847</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemoryPages(</div>
+<div class="line"><a name="l16848"></a><span class="lineno">16848</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16849"></a><span class="lineno">16849</span>&#160;            (uint64_t)allocationCount,</div>
+<div class="line"><a name="l16850"></a><span class="lineno">16850</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l16851"></a><span class="lineno">16851</span>&#160;    }</div>
+<div class="line"><a name="l16852"></a><span class="lineno">16852</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16853"></a><span class="lineno">16853</span>&#160;    </div>
+<div class="line"><a name="l16854"></a><span class="lineno">16854</span>&#160;    allocator-&gt;FreeMemory(allocationCount, pAllocations);</div>
+<div class="line"><a name="l16855"></a><span class="lineno">16855</span>&#160;}</div>
+<div class="line"><a name="l16856"></a><span class="lineno">16856</span>&#160; </div>
+<div class="line"><a name="l16857"></a><span class="lineno">16857</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vmaResizeAllocation</a>(</div>
+<div class="line"><a name="l16858"></a><span class="lineno">16858</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16859"></a><span class="lineno">16859</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l16860"></a><span class="lineno">16860</span>&#160;    VkDeviceSize newSize)</div>
+<div class="line"><a name="l16861"></a><span class="lineno">16861</span>&#160;{</div>
+<div class="line"><a name="l16862"></a><span class="lineno">16862</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l16863"></a><span class="lineno">16863</span>&#160;    </div>
+<div class="line"><a name="l16864"></a><span class="lineno">16864</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaResizeAllocation&quot;</span>);</div>
+<div class="line"><a name="l16865"></a><span class="lineno">16865</span>&#160;    </div>
+<div class="line"><a name="l16866"></a><span class="lineno">16866</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16867"></a><span class="lineno">16867</span>&#160; </div>
+<div class="line"><a name="l16868"></a><span class="lineno">16868</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;ResizeAllocation(allocation, newSize);</div>
+<div class="line"><a name="l16869"></a><span class="lineno">16869</span>&#160;}</div>
+<div class="line"><a name="l16870"></a><span class="lineno">16870</span>&#160; </div>
+<div class="line"><a name="l16871"></a><span class="lineno">16871</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a>(</div>
+<div class="line"><a name="l16872"></a><span class="lineno">16872</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16873"></a><span class="lineno">16873</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l16874"></a><span class="lineno">16874</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16875"></a><span class="lineno">16875</span>&#160;{</div>
+<div class="line"><a name="l16876"></a><span class="lineno">16876</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div>
+<div class="line"><a name="l16877"></a><span class="lineno">16877</span>&#160; </div>
+<div class="line"><a name="l16878"></a><span class="lineno">16878</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16879"></a><span class="lineno">16879</span>&#160; </div>
+<div class="line"><a name="l16880"></a><span class="lineno">16880</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16881"></a><span class="lineno">16881</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16882"></a><span class="lineno">16882</span>&#160;    {</div>
+<div class="line"><a name="l16883"></a><span class="lineno">16883</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div>
+<div class="line"><a name="l16884"></a><span class="lineno">16884</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16885"></a><span class="lineno">16885</span>&#160;            allocation);</div>
+<div class="line"><a name="l16886"></a><span class="lineno">16886</span>&#160;    }</div>
+<div class="line"><a name="l16887"></a><span class="lineno">16887</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16888"></a><span class="lineno">16888</span>&#160; </div>
+<div class="line"><a name="l16889"></a><span class="lineno">16889</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div>
+<div class="line"><a name="l16890"></a><span class="lineno">16890</span>&#160;}</div>
+<div class="line"><a name="l16891"></a><span class="lineno">16891</span>&#160; </div>
+<div class="line"><a name="l16892"></a><span class="lineno">16892</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkBool32 <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a>(</div>
+<div class="line"><a name="l16893"></a><span class="lineno">16893</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16894"></a><span class="lineno">16894</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l16895"></a><span class="lineno">16895</span>&#160;{</div>
+<div class="line"><a name="l16896"></a><span class="lineno">16896</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l16897"></a><span class="lineno">16897</span>&#160; </div>
+<div class="line"><a name="l16898"></a><span class="lineno">16898</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16899"></a><span class="lineno">16899</span>&#160; </div>
+<div class="line"><a name="l16900"></a><span class="lineno">16900</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16901"></a><span class="lineno">16901</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16902"></a><span class="lineno">16902</span>&#160;    {</div>
+<div class="line"><a name="l16903"></a><span class="lineno">16903</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div>
+<div class="line"><a name="l16904"></a><span class="lineno">16904</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16905"></a><span class="lineno">16905</span>&#160;            allocation);</div>
+<div class="line"><a name="l16906"></a><span class="lineno">16906</span>&#160;    }</div>
+<div class="line"><a name="l16907"></a><span class="lineno">16907</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16908"></a><span class="lineno">16908</span>&#160; </div>
+<div class="line"><a name="l16909"></a><span class="lineno">16909</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div>
+<div class="line"><a name="l16910"></a><span class="lineno">16910</span>&#160;}</div>
+<div class="line"><a name="l16911"></a><span class="lineno">16911</span>&#160; </div>
+<div class="line"><a name="l16912"></a><span class="lineno">16912</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vmaSetAllocationUserData</a>(</div>
+<div class="line"><a name="l16913"></a><span class="lineno">16913</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16914"></a><span class="lineno">16914</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l16915"></a><span class="lineno">16915</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l16916"></a><span class="lineno">16916</span>&#160;{</div>
+<div class="line"><a name="l16917"></a><span class="lineno">16917</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l16918"></a><span class="lineno">16918</span>&#160; </div>
+<div class="line"><a name="l16919"></a><span class="lineno">16919</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16920"></a><span class="lineno">16920</span>&#160; </div>
+<div class="line"><a name="l16921"></a><span class="lineno">16921</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div>
+<div class="line"><a name="l16922"></a><span class="lineno">16922</span>&#160; </div>
+<div class="line"><a name="l16923"></a><span class="lineno">16923</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16924"></a><span class="lineno">16924</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16925"></a><span class="lineno">16925</span>&#160;    {</div>
+<div class="line"><a name="l16926"></a><span class="lineno">16926</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div>
+<div class="line"><a name="l16927"></a><span class="lineno">16927</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16928"></a><span class="lineno">16928</span>&#160;            allocation,</div>
+<div class="line"><a name="l16929"></a><span class="lineno">16929</span>&#160;            pUserData);</div>
+<div class="line"><a name="l16930"></a><span class="lineno">16930</span>&#160;    }</div>
+<div class="line"><a name="l16931"></a><span class="lineno">16931</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16932"></a><span class="lineno">16932</span>&#160;}</div>
+<div class="line"><a name="l16933"></a><span class="lineno">16933</span>&#160; </div>
+<div class="line"><a name="l16934"></a><span class="lineno">16934</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vmaCreateLostAllocation</a>(</div>
+<div class="line"><a name="l16935"></a><span class="lineno">16935</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16936"></a><span class="lineno">16936</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l16937"></a><span class="lineno">16937</span>&#160;{</div>
+<div class="line"><a name="l16938"></a><span class="lineno">16938</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l16939"></a><span class="lineno">16939</span>&#160; </div>
+<div class="line"><a name="l16940"></a><span class="lineno">16940</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div>
+<div class="line"><a name="l16941"></a><span class="lineno">16941</span>&#160; </div>
+<div class="line"><a name="l16942"></a><span class="lineno">16942</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div>
+<div class="line"><a name="l16943"></a><span class="lineno">16943</span>&#160; </div>
+<div class="line"><a name="l16944"></a><span class="lineno">16944</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16945"></a><span class="lineno">16945</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16946"></a><span class="lineno">16946</span>&#160;    {</div>
+<div class="line"><a name="l16947"></a><span class="lineno">16947</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div>
+<div class="line"><a name="l16948"></a><span class="lineno">16948</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16949"></a><span class="lineno">16949</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l16950"></a><span class="lineno">16950</span>&#160;    }</div>
+<div class="line"><a name="l16951"></a><span class="lineno">16951</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16952"></a><span class="lineno">16952</span>&#160;}</div>
+<div class="line"><a name="l16953"></a><span class="lineno">16953</span>&#160; </div>
+<div class="line"><a name="l16954"></a><span class="lineno">16954</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a>(</div>
+<div class="line"><a name="l16955"></a><span class="lineno">16955</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16956"></a><span class="lineno">16956</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l16957"></a><span class="lineno">16957</span>&#160;    <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l16958"></a><span class="lineno">16958</span>&#160;{</div>
+<div class="line"><a name="l16959"></a><span class="lineno">16959</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div>
+<div class="line"><a name="l16960"></a><span class="lineno">16960</span>&#160; </div>
+<div class="line"><a name="l16961"></a><span class="lineno">16961</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16962"></a><span class="lineno">16962</span>&#160; </div>
+<div class="line"><a name="l16963"></a><span class="lineno">16963</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div>
+<div class="line"><a name="l16964"></a><span class="lineno">16964</span>&#160; </div>
+<div class="line"><a name="l16965"></a><span class="lineno">16965</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16966"></a><span class="lineno">16966</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16967"></a><span class="lineno">16967</span>&#160;    {</div>
+<div class="line"><a name="l16968"></a><span class="lineno">16968</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div>
+<div class="line"><a name="l16969"></a><span class="lineno">16969</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16970"></a><span class="lineno">16970</span>&#160;            allocation);</div>
+<div class="line"><a name="l16971"></a><span class="lineno">16971</span>&#160;    }</div>
+<div class="line"><a name="l16972"></a><span class="lineno">16972</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16973"></a><span class="lineno">16973</span>&#160; </div>
+<div class="line"><a name="l16974"></a><span class="lineno">16974</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16975"></a><span class="lineno">16975</span>&#160;}</div>
+<div class="line"><a name="l16976"></a><span class="lineno">16976</span>&#160; </div>
+<div class="line"><a name="l16977"></a><span class="lineno">16977</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a>(</div>
+<div class="line"><a name="l16978"></a><span class="lineno">16978</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16979"></a><span class="lineno">16979</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l16980"></a><span class="lineno">16980</span>&#160;{</div>
+<div class="line"><a name="l16981"></a><span class="lineno">16981</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l16982"></a><span class="lineno">16982</span>&#160; </div>
+<div class="line"><a name="l16983"></a><span class="lineno">16983</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16984"></a><span class="lineno">16984</span>&#160; </div>
+<div class="line"><a name="l16985"></a><span class="lineno">16985</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16986"></a><span class="lineno">16986</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16987"></a><span class="lineno">16987</span>&#160;    {</div>
+<div class="line"><a name="l16988"></a><span class="lineno">16988</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div>
+<div class="line"><a name="l16989"></a><span class="lineno">16989</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16990"></a><span class="lineno">16990</span>&#160;            allocation);</div>
+<div class="line"><a name="l16991"></a><span class="lineno">16991</span>&#160;    }</div>
+<div class="line"><a name="l16992"></a><span class="lineno">16992</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16993"></a><span class="lineno">16993</span>&#160; </div>
+<div class="line"><a name="l16994"></a><span class="lineno">16994</span>&#160;    allocator-&gt;Unmap(allocation);</div>
+<div class="line"><a name="l16995"></a><span class="lineno">16995</span>&#160;}</div>
+<div class="line"><a name="l16996"></a><span class="lineno">16996</span>&#160; </div>
+<div class="line"><a name="l16997"></a><span class="lineno">16997</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">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="l16998"></a><span class="lineno">16998</span>&#160;{</div>
+<div class="line"><a name="l16999"></a><span class="lineno">16999</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l17000"></a><span class="lineno">17000</span>&#160; </div>
+<div class="line"><a name="l17001"></a><span class="lineno">17001</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div>
+<div class="line"><a name="l17002"></a><span class="lineno">17002</span>&#160; </div>
+<div class="line"><a name="l17003"></a><span class="lineno">17003</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17004"></a><span class="lineno">17004</span>&#160; </div>
+<div class="line"><a name="l17005"></a><span class="lineno">17005</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l17006"></a><span class="lineno">17006</span>&#160; </div>
+<div class="line"><a name="l17007"></a><span class="lineno">17007</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17008"></a><span class="lineno">17008</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17009"></a><span class="lineno">17009</span>&#160;    {</div>
+<div class="line"><a name="l17010"></a><span class="lineno">17010</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div>
+<div class="line"><a name="l17011"></a><span class="lineno">17011</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17012"></a><span class="lineno">17012</span>&#160;            allocation, offset, size);</div>
+<div class="line"><a name="l17013"></a><span class="lineno">17013</span>&#160;    }</div>
+<div class="line"><a name="l17014"></a><span class="lineno">17014</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17015"></a><span class="lineno">17015</span>&#160;}</div>
+<div class="line"><a name="l17016"></a><span class="lineno">17016</span>&#160; </div>
+<div class="line"><a name="l17017"></a><span class="lineno">17017</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">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="l17018"></a><span class="lineno">17018</span>&#160;{</div>
+<div class="line"><a name="l17019"></a><span class="lineno">17019</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l17020"></a><span class="lineno">17020</span>&#160; </div>
+<div class="line"><a name="l17021"></a><span class="lineno">17021</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div>
+<div class="line"><a name="l17022"></a><span class="lineno">17022</span>&#160; </div>
+<div class="line"><a name="l17023"></a><span class="lineno">17023</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17024"></a><span class="lineno">17024</span>&#160; </div>
+<div class="line"><a name="l17025"></a><span class="lineno">17025</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l17026"></a><span class="lineno">17026</span>&#160; </div>
+<div class="line"><a name="l17027"></a><span class="lineno">17027</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17028"></a><span class="lineno">17028</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17029"></a><span class="lineno">17029</span>&#160;    {</div>
+<div class="line"><a name="l17030"></a><span class="lineno">17030</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div>
+<div class="line"><a name="l17031"></a><span class="lineno">17031</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17032"></a><span class="lineno">17032</span>&#160;            allocation, offset, size);</div>
+<div class="line"><a name="l17033"></a><span class="lineno">17033</span>&#160;    }</div>
+<div class="line"><a name="l17034"></a><span class="lineno">17034</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17035"></a><span class="lineno">17035</span>&#160;}</div>
+<div class="line"><a name="l17036"></a><span class="lineno">17036</span>&#160; </div>
+<div class="line"><a name="l17037"></a><span class="lineno">17037</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div>
+<div class="line"><a name="l17038"></a><span class="lineno">17038</span>&#160;{</div>
+<div class="line"><a name="l17039"></a><span class="lineno">17039</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17040"></a><span class="lineno">17040</span>&#160; </div>
+<div class="line"><a name="l17041"></a><span class="lineno">17041</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div>
+<div class="line"><a name="l17042"></a><span class="lineno">17042</span>&#160; </div>
+<div class="line"><a name="l17043"></a><span class="lineno">17043</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17044"></a><span class="lineno">17044</span>&#160; </div>
+<div class="line"><a name="l17045"></a><span class="lineno">17045</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div>
+<div class="line"><a name="l17046"></a><span class="lineno">17046</span>&#160;}</div>
+<div class="line"><a name="l17047"></a><span class="lineno">17047</span>&#160; </div>
+<div class="line"><a name="l17048"></a><span class="lineno">17048</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">vmaDefragment</a>(</div>
+<div class="line"><a name="l17049"></a><span class="lineno">17049</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17050"></a><span class="lineno">17050</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l17051"></a><span class="lineno">17051</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l17052"></a><span class="lineno">17052</span>&#160;    VkBool32* pAllocationsChanged,</div>
+<div class="line"><a name="l17053"></a><span class="lineno">17053</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="l17054"></a><span class="lineno">17054</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
+<div class="line"><a name="l17055"></a><span class="lineno">17055</span>&#160;{</div>
+<div class="line"><a name="l17056"></a><span class="lineno">17056</span>&#160;    <span class="comment">// Deprecated interface, reimplemented using new one.</span></div>
+<div class="line"><a name="l17057"></a><span class="lineno">17057</span>&#160; </div>
+<div class="line"><a name="l17058"></a><span class="lineno">17058</span>&#160;    <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div>
+<div class="line"><a name="l17059"></a><span class="lineno">17059</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div>
+<div class="line"><a name="l17060"></a><span class="lineno">17060</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = pAllocations;</div>
+<div class="line"><a name="l17061"></a><span class="lineno">17061</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div>
+<div class="line"><a name="l17062"></a><span class="lineno">17062</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17063"></a><span class="lineno">17063</span>&#160;    {</div>
+<div class="line"><a name="l17064"></a><span class="lineno">17064</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="l17065"></a><span class="lineno">17065</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="l17066"></a><span class="lineno">17066</span>&#160;    }</div>
+<div class="line"><a name="l17067"></a><span class="lineno">17067</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17068"></a><span class="lineno">17068</span>&#160;    {</div>
+<div class="line"><a name="l17069"></a><span class="lineno">17069</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div>
+<div class="line"><a name="l17070"></a><span class="lineno">17070</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l17071"></a><span class="lineno">17071</span>&#160;    }</div>
+<div class="line"><a name="l17072"></a><span class="lineno">17072</span>&#160;    <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div>
+<div class="line"><a name="l17073"></a><span class="lineno">17073</span>&#160; </div>
+<div class="line"><a name="l17074"></a><span class="lineno">17074</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div>
+<div class="line"><a name="l17075"></a><span class="lineno">17075</span>&#160;    VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a>(allocator, &amp;info2, pDefragmentationStats, &amp;ctx);</div>
+<div class="line"><a name="l17076"></a><span class="lineno">17076</span>&#160;    <span class="keywordflow">if</span>(res == VK_NOT_READY)</div>
+<div class="line"><a name="l17077"></a><span class="lineno">17077</span>&#160;    {</div>
+<div class="line"><a name="l17078"></a><span class="lineno">17078</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a>( allocator, ctx);</div>
+<div class="line"><a name="l17079"></a><span class="lineno">17079</span>&#160;    }</div>
+<div class="line"><a name="l17080"></a><span class="lineno">17080</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17081"></a><span class="lineno">17081</span>&#160;}</div>
+<div class="line"><a name="l17082"></a><span class="lineno">17082</span>&#160; </div>
+<div class="line"><a name="l17083"></a><span class="lineno">17083</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a>(</div>
+<div class="line"><a name="l17084"></a><span class="lineno">17084</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17085"></a><span class="lineno">17085</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="l17086"></a><span class="lineno">17086</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l17087"></a><span class="lineno">17087</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div>
+<div class="line"><a name="l17088"></a><span class="lineno">17088</span>&#160;{</div>
+<div class="line"><a name="l17089"></a><span class="lineno">17089</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pInfo &amp;&amp; pContext);</div>
+<div class="line"><a name="l17090"></a><span class="lineno">17090</span>&#160; </div>
+<div class="line"><a name="l17091"></a><span class="lineno">17091</span>&#160;    <span class="comment">// Degenerate case: Nothing to defragment.</span></div>
+<div class="line"><a name="l17092"></a><span class="lineno">17092</span>&#160;    <span class="keywordflow">if</span>(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 &amp;&amp; pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div>
+<div class="line"><a name="l17093"></a><span class="lineno">17093</span>&#160;    {</div>
+<div class="line"><a name="l17094"></a><span class="lineno">17094</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17095"></a><span class="lineno">17095</span>&#160;    }</div>
+<div class="line"><a name="l17096"></a><span class="lineno">17096</span>&#160; </div>
+<div class="line"><a name="l17097"></a><span class="lineno">17097</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> != VMA_NULL);</div>
+<div class="line"><a name="l17098"></a><span class="lineno">17098</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a> != VMA_NULL);</div>
+<div class="line"><a name="l17099"></a><span class="lineno">17099</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>));</div>
+<div class="line"><a name="l17100"></a><span class="lineno">17100</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>));</div>
+<div class="line"><a name="l17101"></a><span class="lineno">17101</span>&#160; </div>
+<div class="line"><a name="l17102"></a><span class="lineno">17102</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationBegin&quot;</span>);</div>
+<div class="line"><a name="l17103"></a><span class="lineno">17103</span>&#160; </div>
+<div class="line"><a name="l17104"></a><span class="lineno">17104</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17105"></a><span class="lineno">17105</span>&#160; </div>
+<div class="line"><a name="l17106"></a><span class="lineno">17106</span>&#160;    VkResult res = allocator-&gt;DefragmentationBegin(*pInfo, pStats, pContext);</div>
+<div class="line"><a name="l17107"></a><span class="lineno">17107</span>&#160; </div>
+<div class="line"><a name="l17108"></a><span class="lineno">17108</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17109"></a><span class="lineno">17109</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17110"></a><span class="lineno">17110</span>&#160;    {</div>
+<div class="line"><a name="l17111"></a><span class="lineno">17111</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDefragmentationBegin(</div>
+<div class="line"><a name="l17112"></a><span class="lineno">17112</span>&#160;            allocator-&gt;GetCurrentFrameIndex(), *pInfo, *pContext);</div>
+<div class="line"><a name="l17113"></a><span class="lineno">17113</span>&#160;    }</div>
+<div class="line"><a name="l17114"></a><span class="lineno">17114</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17115"></a><span class="lineno">17115</span>&#160; </div>
+<div class="line"><a name="l17116"></a><span class="lineno">17116</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17117"></a><span class="lineno">17117</span>&#160;}</div>
+<div class="line"><a name="l17118"></a><span class="lineno">17118</span>&#160; </div>
+<div class="line"><a name="l17119"></a><span class="lineno">17119</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a>(</div>
+<div class="line"><a name="l17120"></a><span class="lineno">17120</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17121"></a><span class="lineno">17121</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l17122"></a><span class="lineno">17122</span>&#160;{</div>
+<div class="line"><a name="l17123"></a><span class="lineno">17123</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17124"></a><span class="lineno">17124</span>&#160; </div>
+<div class="line"><a name="l17125"></a><span class="lineno">17125</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationEnd&quot;</span>);</div>
+<div class="line"><a name="l17126"></a><span class="lineno">17126</span>&#160; </div>
+<div class="line"><a name="l17127"></a><span class="lineno">17127</span>&#160;    <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17128"></a><span class="lineno">17128</span>&#160;    {</div>
+<div class="line"><a name="l17129"></a><span class="lineno">17129</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17130"></a><span class="lineno">17130</span>&#160; </div>
+<div class="line"><a name="l17131"></a><span class="lineno">17131</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17132"></a><span class="lineno">17132</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17133"></a><span class="lineno">17133</span>&#160;        {</div>
+<div class="line"><a name="l17134"></a><span class="lineno">17134</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordDefragmentationEnd(</div>
+<div class="line"><a name="l17135"></a><span class="lineno">17135</span>&#160;                allocator-&gt;GetCurrentFrameIndex(), context);</div>
+<div class="line"><a name="l17136"></a><span class="lineno">17136</span>&#160;        }</div>
+<div class="line"><a name="l17137"></a><span class="lineno">17137</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17138"></a><span class="lineno">17138</span>&#160; </div>
+<div class="line"><a name="l17139"></a><span class="lineno">17139</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;DefragmentationEnd(context);</div>
+<div class="line"><a name="l17140"></a><span class="lineno">17140</span>&#160;    }</div>
+<div class="line"><a name="l17141"></a><span class="lineno">17141</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17142"></a><span class="lineno">17142</span>&#160;    {</div>
+<div class="line"><a name="l17143"></a><span class="lineno">17143</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17144"></a><span class="lineno">17144</span>&#160;    }</div>
+<div class="line"><a name="l17145"></a><span class="lineno">17145</span>&#160;}</div>
+<div class="line"><a name="l17146"></a><span class="lineno">17146</span>&#160; </div>
+<div class="line"><a name="l17147"></a><span class="lineno">17147</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a>(</div>
+<div class="line"><a name="l17148"></a><span class="lineno">17148</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17149"></a><span class="lineno">17149</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17150"></a><span class="lineno">17150</span>&#160;    VkBuffer buffer)</div>
+<div class="line"><a name="l17151"></a><span class="lineno">17151</span>&#160;{</div>
+<div class="line"><a name="l17152"></a><span class="lineno">17152</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
+<div class="line"><a name="l17153"></a><span class="lineno">17153</span>&#160; </div>
+<div class="line"><a name="l17154"></a><span class="lineno">17154</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div>
+<div class="line"><a name="l17155"></a><span class="lineno">17155</span>&#160; </div>
+<div class="line"><a name="l17156"></a><span class="lineno">17156</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17157"></a><span class="lineno">17157</span>&#160; </div>
+<div class="line"><a name="l17158"></a><span class="lineno">17158</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div>
+<div class="line"><a name="l17159"></a><span class="lineno">17159</span>&#160;}</div>
+<div class="line"><a name="l17160"></a><span class="lineno">17160</span>&#160; </div>
+<div class="line"><a name="l17161"></a><span class="lineno">17161</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vmaBindBufferMemory2</a>(</div>
+<div class="line"><a name="l17162"></a><span class="lineno">17162</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17163"></a><span class="lineno">17163</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17164"></a><span class="lineno">17164</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17165"></a><span class="lineno">17165</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l17166"></a><span class="lineno">17166</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17167"></a><span class="lineno">17167</span>&#160;{</div>
+<div class="line"><a name="l17168"></a><span class="lineno">17168</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
+<div class="line"><a name="l17169"></a><span class="lineno">17169</span>&#160; </div>
+<div class="line"><a name="l17170"></a><span class="lineno">17170</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory2&quot;</span>);</div>
+<div class="line"><a name="l17171"></a><span class="lineno">17171</span>&#160; </div>
+<div class="line"><a name="l17172"></a><span class="lineno">17172</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17173"></a><span class="lineno">17173</span>&#160; </div>
+<div class="line"><a name="l17174"></a><span class="lineno">17174</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div>
+<div class="line"><a name="l17175"></a><span class="lineno">17175</span>&#160;}</div>
+<div class="line"><a name="l17176"></a><span class="lineno">17176</span>&#160; </div>
+<div class="line"><a name="l17177"></a><span class="lineno">17177</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vmaBindImageMemory</a>(</div>
+<div class="line"><a name="l17178"></a><span class="lineno">17178</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17179"></a><span class="lineno">17179</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17180"></a><span class="lineno">17180</span>&#160;    VkImage image)</div>
+<div class="line"><a name="l17181"></a><span class="lineno">17181</span>&#160;{</div>
+<div class="line"><a name="l17182"></a><span class="lineno">17182</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
+<div class="line"><a name="l17183"></a><span class="lineno">17183</span>&#160; </div>
+<div class="line"><a name="l17184"></a><span class="lineno">17184</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div>
+<div class="line"><a name="l17185"></a><span class="lineno">17185</span>&#160; </div>
+<div class="line"><a name="l17186"></a><span class="lineno">17186</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17187"></a><span class="lineno">17187</span>&#160; </div>
+<div class="line"><a name="l17188"></a><span class="lineno">17188</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, 0, image, VMA_NULL);</div>
+<div class="line"><a name="l17189"></a><span class="lineno">17189</span>&#160;}</div>
+<div class="line"><a name="l17190"></a><span class="lineno">17190</span>&#160; </div>
+<div class="line"><a name="l17191"></a><span class="lineno">17191</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vmaBindImageMemory2</a>(</div>
+<div class="line"><a name="l17192"></a><span class="lineno">17192</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17193"></a><span class="lineno">17193</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17194"></a><span class="lineno">17194</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17195"></a><span class="lineno">17195</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l17196"></a><span class="lineno">17196</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17197"></a><span class="lineno">17197</span>&#160;{</div>
+<div class="line"><a name="l17198"></a><span class="lineno">17198</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
+<div class="line"><a name="l17199"></a><span class="lineno">17199</span>&#160; </div>
+<div class="line"><a name="l17200"></a><span class="lineno">17200</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory2&quot;</span>);</div>
+<div class="line"><a name="l17201"></a><span class="lineno">17201</span>&#160; </div>
+<div class="line"><a name="l17202"></a><span class="lineno">17202</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17203"></a><span class="lineno">17203</span>&#160; </div>
+<div class="line"><a name="l17204"></a><span class="lineno">17204</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div>
+<div class="line"><a name="l17205"></a><span class="lineno">17205</span>&#160;}</div>
+<div class="line"><a name="l17206"></a><span class="lineno">17206</span>&#160; </div>
+<div class="line"><a name="l17207"></a><span class="lineno">17207</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l17208"></a><span class="lineno">17208</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17209"></a><span class="lineno">17209</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l17210"></a><span class="lineno">17210</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="l17211"></a><span class="lineno">17211</span>&#160;    VkBuffer* pBuffer,</div>
+<div class="line"><a name="l17212"></a><span class="lineno">17212</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l17213"></a><span class="lineno">17213</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17214"></a><span class="lineno">17214</span>&#160;{</div>
+<div class="line"><a name="l17215"></a><span class="lineno">17215</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l17216"></a><span class="lineno">17216</span>&#160; </div>
+<div class="line"><a name="l17217"></a><span class="lineno">17217</span>&#160;    <span class="keywordflow">if</span>(pBufferCreateInfo-&gt;size == 0)</div>
+<div class="line"><a name="l17218"></a><span class="lineno">17218</span>&#160;    {</div>
+<div class="line"><a name="l17219"></a><span class="lineno">17219</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l17220"></a><span class="lineno">17220</span>&#160;    }</div>
+<div class="line"><a name="l17221"></a><span class="lineno">17221</span>&#160;    </div>
+<div class="line"><a name="l17222"></a><span class="lineno">17222</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div>
+<div class="line"><a name="l17223"></a><span class="lineno">17223</span>&#160;    </div>
+<div class="line"><a name="l17224"></a><span class="lineno">17224</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17225"></a><span class="lineno">17225</span>&#160; </div>
+<div class="line"><a name="l17226"></a><span class="lineno">17226</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17227"></a><span class="lineno">17227</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17228"></a><span class="lineno">17228</span>&#160; </div>
+<div class="line"><a name="l17229"></a><span class="lineno">17229</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div>
+<div class="line"><a name="l17230"></a><span class="lineno">17230</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l17231"></a><span class="lineno">17231</span>&#160;        allocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l17232"></a><span class="lineno">17232</span>&#160;        pBufferCreateInfo,</div>
+<div class="line"><a name="l17233"></a><span class="lineno">17233</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
+<div class="line"><a name="l17234"></a><span class="lineno">17234</span>&#160;        pBuffer);</div>
+<div class="line"><a name="l17235"></a><span class="lineno">17235</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17236"></a><span class="lineno">17236</span>&#160;    {</div>
+<div class="line"><a name="l17237"></a><span class="lineno">17237</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div>
+<div class="line"><a name="l17238"></a><span class="lineno">17238</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l17239"></a><span class="lineno">17239</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17240"></a><span class="lineno">17240</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17241"></a><span class="lineno">17241</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div>
+<div class="line"><a name="l17242"></a><span class="lineno">17242</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17243"></a><span class="lineno">17243</span>&#160; </div>
+<div class="line"><a name="l17244"></a><span class="lineno">17244</span>&#160;        <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div>
+<div class="line"><a name="l17245"></a><span class="lineno">17245</span>&#160;        <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div>
+<div class="line"><a name="l17246"></a><span class="lineno">17246</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="l17247"></a><span class="lineno">17247</span>&#160;        {</div>
+<div class="line"><a name="l17248"></a><span class="lineno">17248</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17249"></a><span class="lineno">17249</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17250"></a><span class="lineno">17250</span>&#160;        }</div>
+<div class="line"><a name="l17251"></a><span class="lineno">17251</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div>
+<div class="line"><a name="l17252"></a><span class="lineno">17252</span>&#160;        {</div>
+<div class="line"><a name="l17253"></a><span class="lineno">17253</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17254"></a><span class="lineno">17254</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17255"></a><span class="lineno">17255</span>&#160;        }</div>
+<div class="line"><a name="l17256"></a><span class="lineno">17256</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div>
+<div class="line"><a name="l17257"></a><span class="lineno">17257</span>&#160;        {</div>
+<div class="line"><a name="l17258"></a><span class="lineno">17258</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17259"></a><span class="lineno">17259</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17260"></a><span class="lineno">17260</span>&#160;        }</div>
+<div class="line"><a name="l17261"></a><span class="lineno">17261</span>&#160; </div>
+<div class="line"><a name="l17262"></a><span class="lineno">17262</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l17263"></a><span class="lineno">17263</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l17264"></a><span class="lineno">17264</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l17265"></a><span class="lineno">17265</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17266"></a><span class="lineno">17266</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17267"></a><span class="lineno">17267</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l17268"></a><span class="lineno">17268</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l17269"></a><span class="lineno">17269</span>&#160;            *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17270"></a><span class="lineno">17270</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l17271"></a><span class="lineno">17271</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17272"></a><span class="lineno">17272</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l17273"></a><span class="lineno">17273</span>&#160; </div>
+<div class="line"><a name="l17274"></a><span class="lineno">17274</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17275"></a><span class="lineno">17275</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17276"></a><span class="lineno">17276</span>&#160;        {</div>
+<div class="line"><a name="l17277"></a><span class="lineno">17277</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div>
+<div class="line"><a name="l17278"></a><span class="lineno">17278</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17279"></a><span class="lineno">17279</span>&#160;                *pBufferCreateInfo,</div>
+<div class="line"><a name="l17280"></a><span class="lineno">17280</span>&#160;                *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17281"></a><span class="lineno">17281</span>&#160;                *pAllocation);</div>
+<div class="line"><a name="l17282"></a><span class="lineno">17282</span>&#160;        }</div>
+<div class="line"><a name="l17283"></a><span class="lineno">17283</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17284"></a><span class="lineno">17284</span>&#160; </div>
+<div class="line"><a name="l17285"></a><span class="lineno">17285</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17286"></a><span class="lineno">17286</span>&#160;        {</div>
+<div class="line"><a name="l17287"></a><span class="lineno">17287</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div>
+<div class="line"><a name="l17288"></a><span class="lineno">17288</span>&#160;            <span class="keywordflow">if</span>((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#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l17289"></a><span class="lineno">17289</span>&#160;            {</div>
+<div class="line"><a name="l17290"></a><span class="lineno">17290</span>&#160;                res = allocator-&gt;BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div>
+<div class="line"><a name="l17291"></a><span class="lineno">17291</span>&#160;            }</div>
+<div class="line"><a name="l17292"></a><span class="lineno">17292</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17293"></a><span class="lineno">17293</span>&#160;            {</div>
+<div class="line"><a name="l17294"></a><span class="lineno">17294</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l17295"></a><span class="lineno">17295</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17296"></a><span class="lineno">17296</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div>
+<div class="line"><a name="l17297"></a><span class="lineno">17297</span>&#160;<span class="preprocessor">                #endif</span></div>
+<div class="line"><a name="l17298"></a><span class="lineno">17298</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17299"></a><span class="lineno">17299</span>&#160;                {</div>
+<div class="line"><a name="l17300"></a><span class="lineno">17300</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17301"></a><span class="lineno">17301</span>&#160;                }</div>
+<div class="line"><a name="l17302"></a><span class="lineno">17302</span>&#160; </div>
+<div class="line"><a name="l17303"></a><span class="lineno">17303</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17304"></a><span class="lineno">17304</span>&#160;            }</div>
+<div class="line"><a name="l17305"></a><span class="lineno">17305</span>&#160;            allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l17306"></a><span class="lineno">17306</span>&#160;                1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17307"></a><span class="lineno">17307</span>&#160;                pAllocation);</div>
+<div class="line"><a name="l17308"></a><span class="lineno">17308</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17309"></a><span class="lineno">17309</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17310"></a><span class="lineno">17310</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17311"></a><span class="lineno">17311</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17312"></a><span class="lineno">17312</span>&#160;        }</div>
+<div class="line"><a name="l17313"></a><span class="lineno">17313</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17314"></a><span class="lineno">17314</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17315"></a><span class="lineno">17315</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17316"></a><span class="lineno">17316</span>&#160;    }</div>
+<div class="line"><a name="l17317"></a><span class="lineno">17317</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17318"></a><span class="lineno">17318</span>&#160;}</div>
+<div class="line"><a name="l17319"></a><span class="lineno">17319</span>&#160; </div>
+<div class="line"><a name="l17320"></a><span class="lineno">17320</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a>(</div>
+<div class="line"><a name="l17321"></a><span class="lineno">17321</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17322"></a><span class="lineno">17322</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l17323"></a><span class="lineno">17323</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17324"></a><span class="lineno">17324</span>&#160;{</div>
+<div class="line"><a name="l17325"></a><span class="lineno">17325</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17326"></a><span class="lineno">17326</span>&#160; </div>
+<div class="line"><a name="l17327"></a><span class="lineno">17327</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17328"></a><span class="lineno">17328</span>&#160;    {</div>
+<div class="line"><a name="l17329"></a><span class="lineno">17329</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17330"></a><span class="lineno">17330</span>&#160;    }</div>
+<div class="line"><a name="l17331"></a><span class="lineno">17331</span>&#160; </div>
+<div class="line"><a name="l17332"></a><span class="lineno">17332</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div>
+<div class="line"><a name="l17333"></a><span class="lineno">17333</span>&#160; </div>
+<div class="line"><a name="l17334"></a><span class="lineno">17334</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17335"></a><span class="lineno">17335</span>&#160; </div>
+<div class="line"><a name="l17336"></a><span class="lineno">17336</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17337"></a><span class="lineno">17337</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17338"></a><span class="lineno">17338</span>&#160;    {</div>
+<div class="line"><a name="l17339"></a><span class="lineno">17339</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div>
+<div class="line"><a name="l17340"></a><span class="lineno">17340</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17341"></a><span class="lineno">17341</span>&#160;            allocation);</div>
+<div class="line"><a name="l17342"></a><span class="lineno">17342</span>&#160;    }</div>
+<div class="line"><a name="l17343"></a><span class="lineno">17343</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17344"></a><span class="lineno">17344</span>&#160; </div>
+<div class="line"><a name="l17345"></a><span class="lineno">17345</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17346"></a><span class="lineno">17346</span>&#160;    {</div>
+<div class="line"><a name="l17347"></a><span class="lineno">17347</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17348"></a><span class="lineno">17348</span>&#160;    }</div>
+<div class="line"><a name="l17349"></a><span class="lineno">17349</span>&#160; </div>
+<div class="line"><a name="l17350"></a><span class="lineno">17350</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17351"></a><span class="lineno">17351</span>&#160;    {</div>
+<div class="line"><a name="l17352"></a><span class="lineno">17352</span>&#160;        allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l17353"></a><span class="lineno">17353</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17354"></a><span class="lineno">17354</span>&#160;            &amp;allocation);</div>
+<div class="line"><a name="l17355"></a><span class="lineno">17355</span>&#160;    }</div>
+<div class="line"><a name="l17356"></a><span class="lineno">17356</span>&#160;}</div>
+<div class="line"><a name="l17357"></a><span class="lineno">17357</span>&#160; </div>
+<div class="line"><a name="l17358"></a><span class="lineno">17358</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> VkResult <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a>(</div>
+<div class="line"><a name="l17359"></a><span class="lineno">17359</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17360"></a><span class="lineno">17360</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l17361"></a><span class="lineno">17361</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="l17362"></a><span class="lineno">17362</span>&#160;    VkImage* pImage,</div>
+<div class="line"><a name="l17363"></a><span class="lineno">17363</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l17364"></a><span class="lineno">17364</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17365"></a><span class="lineno">17365</span>&#160;{</div>
+<div class="line"><a name="l17366"></a><span class="lineno">17366</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l17367"></a><span class="lineno">17367</span>&#160; </div>
+<div class="line"><a name="l17368"></a><span class="lineno">17368</span>&#160;    <span class="keywordflow">if</span>(pImageCreateInfo-&gt;extent.width == 0 ||</div>
+<div class="line"><a name="l17369"></a><span class="lineno">17369</span>&#160;        pImageCreateInfo-&gt;extent.height == 0 ||</div>
+<div class="line"><a name="l17370"></a><span class="lineno">17370</span>&#160;        pImageCreateInfo-&gt;extent.depth == 0 ||</div>
+<div class="line"><a name="l17371"></a><span class="lineno">17371</span>&#160;        pImageCreateInfo-&gt;mipLevels == 0 ||</div>
+<div class="line"><a name="l17372"></a><span class="lineno">17372</span>&#160;        pImageCreateInfo-&gt;arrayLayers == 0)</div>
+<div class="line"><a name="l17373"></a><span class="lineno">17373</span>&#160;    {</div>
+<div class="line"><a name="l17374"></a><span class="lineno">17374</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l17375"></a><span class="lineno">17375</span>&#160;    }</div>
+<div class="line"><a name="l17376"></a><span class="lineno">17376</span>&#160; </div>
+<div class="line"><a name="l17377"></a><span class="lineno">17377</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div>
+<div class="line"><a name="l17378"></a><span class="lineno">17378</span>&#160; </div>
+<div class="line"><a name="l17379"></a><span class="lineno">17379</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17380"></a><span class="lineno">17380</span>&#160; </div>
+<div class="line"><a name="l17381"></a><span class="lineno">17381</span>&#160;    *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17382"></a><span class="lineno">17382</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17383"></a><span class="lineno">17383</span>&#160; </div>
+<div class="line"><a name="l17384"></a><span class="lineno">17384</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div>
+<div class="line"><a name="l17385"></a><span class="lineno">17385</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div>
+<div class="line"><a name="l17386"></a><span class="lineno">17386</span>&#160;        allocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l17387"></a><span class="lineno">17387</span>&#160;        pImageCreateInfo,</div>
+<div class="line"><a name="l17388"></a><span class="lineno">17388</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
+<div class="line"><a name="l17389"></a><span class="lineno">17389</span>&#160;        pImage);</div>
+<div class="line"><a name="l17390"></a><span class="lineno">17390</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17391"></a><span class="lineno">17391</span>&#160;    {</div>
+<div class="line"><a name="l17392"></a><span class="lineno">17392</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div>
+<div class="line"><a name="l17393"></a><span class="lineno">17393</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div>
+<div class="line"><a name="l17394"></a><span class="lineno">17394</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div>
+<div class="line"><a name="l17395"></a><span class="lineno">17395</span>&#160;        </div>
+<div class="line"><a name="l17396"></a><span class="lineno">17396</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l17397"></a><span class="lineno">17397</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l17398"></a><span class="lineno">17398</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17399"></a><span class="lineno">17399</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17400"></a><span class="lineno">17400</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div>
+<div class="line"><a name="l17401"></a><span class="lineno">17401</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17402"></a><span class="lineno">17402</span>&#160; </div>
+<div class="line"><a name="l17403"></a><span class="lineno">17403</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l17404"></a><span class="lineno">17404</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l17405"></a><span class="lineno">17405</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17406"></a><span class="lineno">17406</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17407"></a><span class="lineno">17407</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l17408"></a><span class="lineno">17408</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l17409"></a><span class="lineno">17409</span>&#160;            *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17410"></a><span class="lineno">17410</span>&#160;            suballocType,</div>
+<div class="line"><a name="l17411"></a><span class="lineno">17411</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17412"></a><span class="lineno">17412</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l17413"></a><span class="lineno">17413</span>&#160; </div>
+<div class="line"><a name="l17414"></a><span class="lineno">17414</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17415"></a><span class="lineno">17415</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17416"></a><span class="lineno">17416</span>&#160;        {</div>
+<div class="line"><a name="l17417"></a><span class="lineno">17417</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div>
+<div class="line"><a name="l17418"></a><span class="lineno">17418</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17419"></a><span class="lineno">17419</span>&#160;                *pImageCreateInfo,</div>
+<div class="line"><a name="l17420"></a><span class="lineno">17420</span>&#160;                *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17421"></a><span class="lineno">17421</span>&#160;                *pAllocation);</div>
+<div class="line"><a name="l17422"></a><span class="lineno">17422</span>&#160;        }</div>
+<div class="line"><a name="l17423"></a><span class="lineno">17423</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17424"></a><span class="lineno">17424</span>&#160; </div>
+<div class="line"><a name="l17425"></a><span class="lineno">17425</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17426"></a><span class="lineno">17426</span>&#160;        {</div>
+<div class="line"><a name="l17427"></a><span class="lineno">17427</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div>
+<div class="line"><a name="l17428"></a><span class="lineno">17428</span>&#160;            <span class="keywordflow">if</span>((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#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l17429"></a><span class="lineno">17429</span>&#160;            {</div>
+<div class="line"><a name="l17430"></a><span class="lineno">17430</span>&#160;                res = allocator-&gt;BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div>
+<div class="line"><a name="l17431"></a><span class="lineno">17431</span>&#160;            }</div>
+<div class="line"><a name="l17432"></a><span class="lineno">17432</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l17433"></a><span class="lineno">17433</span>&#160;            {</div>
+<div class="line"><a name="l17434"></a><span class="lineno">17434</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l17435"></a><span class="lineno">17435</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17436"></a><span class="lineno">17436</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div>
+<div class="line"><a name="l17437"></a><span class="lineno">17437</span>&#160;<span class="preprocessor">                #endif</span></div>
+<div class="line"><a name="l17438"></a><span class="lineno">17438</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17439"></a><span class="lineno">17439</span>&#160;                {</div>
+<div class="line"><a name="l17440"></a><span class="lineno">17440</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17441"></a><span class="lineno">17441</span>&#160;                }</div>
+<div class="line"><a name="l17442"></a><span class="lineno">17442</span>&#160; </div>
+<div class="line"><a name="l17443"></a><span class="lineno">17443</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17444"></a><span class="lineno">17444</span>&#160;            }</div>
+<div class="line"><a name="l17445"></a><span class="lineno">17445</span>&#160;            allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l17446"></a><span class="lineno">17446</span>&#160;                1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17447"></a><span class="lineno">17447</span>&#160;                pAllocation);</div>
+<div class="line"><a name="l17448"></a><span class="lineno">17448</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17449"></a><span class="lineno">17449</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17450"></a><span class="lineno">17450</span>&#160;            *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17451"></a><span class="lineno">17451</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17452"></a><span class="lineno">17452</span>&#160;        }</div>
+<div class="line"><a name="l17453"></a><span class="lineno">17453</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17454"></a><span class="lineno">17454</span>&#160;        *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17455"></a><span class="lineno">17455</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17456"></a><span class="lineno">17456</span>&#160;    }</div>
+<div class="line"><a name="l17457"></a><span class="lineno">17457</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17458"></a><span class="lineno">17458</span>&#160;}</div>
+<div class="line"><a name="l17459"></a><span class="lineno">17459</span>&#160; </div>
+<div class="line"><a name="l17460"></a><span class="lineno">17460</span>&#160;<a class="code" href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a> <span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a> <a class="code" href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vmaDestroyImage</a>(</div>
+<div class="line"><a name="l17461"></a><span class="lineno">17461</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17462"></a><span class="lineno">17462</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l17463"></a><span class="lineno">17463</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17464"></a><span class="lineno">17464</span>&#160;{</div>
+<div class="line"><a name="l17465"></a><span class="lineno">17465</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17466"></a><span class="lineno">17466</span>&#160; </div>
+<div class="line"><a name="l17467"></a><span class="lineno">17467</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17468"></a><span class="lineno">17468</span>&#160;    {</div>
+<div class="line"><a name="l17469"></a><span class="lineno">17469</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17470"></a><span class="lineno">17470</span>&#160;    }</div>
+<div class="line"><a name="l17471"></a><span class="lineno">17471</span>&#160; </div>
+<div class="line"><a name="l17472"></a><span class="lineno">17472</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div>
+<div class="line"><a name="l17473"></a><span class="lineno">17473</span>&#160; </div>
+<div class="line"><a name="l17474"></a><span class="lineno">17474</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17475"></a><span class="lineno">17475</span>&#160; </div>
+<div class="line"><a name="l17476"></a><span class="lineno">17476</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17477"></a><span class="lineno">17477</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17478"></a><span class="lineno">17478</span>&#160;    {</div>
+<div class="line"><a name="l17479"></a><span class="lineno">17479</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div>
+<div class="line"><a name="l17480"></a><span class="lineno">17480</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17481"></a><span class="lineno">17481</span>&#160;            allocation);</div>
+<div class="line"><a name="l17482"></a><span class="lineno">17482</span>&#160;    }</div>
+<div class="line"><a name="l17483"></a><span class="lineno">17483</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17484"></a><span class="lineno">17484</span>&#160; </div>
+<div class="line"><a name="l17485"></a><span class="lineno">17485</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17486"></a><span class="lineno">17486</span>&#160;    {</div>
+<div class="line"><a name="l17487"></a><span class="lineno">17487</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l17488"></a><span class="lineno">17488</span>&#160;    }</div>
+<div class="line"><a name="l17489"></a><span class="lineno">17489</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17490"></a><span class="lineno">17490</span>&#160;    {</div>
+<div class="line"><a name="l17491"></a><span class="lineno">17491</span>&#160;        allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l17492"></a><span class="lineno">17492</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17493"></a><span class="lineno">17493</span>&#160;            &amp;allocation);</div>
+<div class="line"><a name="l17494"></a><span class="lineno">17494</span>&#160;    }</div>
+<div class="line"><a name="l17495"></a><span class="lineno">17495</span>&#160;}</div>
+<div class="line"><a name="l17496"></a><span class="lineno">17496</span>&#160; </div>
+<div class="line"><a name="l17497"></a><span class="lineno">17497</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div>
 </div><!-- fragment --></div><!-- contents -->
+<div class="ttc" id="astruct_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:1961</div></div>
+<div class="ttc" id="astruct_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:1919</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a425905e868e4b487b5188f9d834dacbc"><div class="ttname"><a href="vk__mem__alloc_8h.html#a425905e868e4b487b5188f9d834dacbc">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:1851</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_abb343b27164d08d2b97e3b0c30ecdcbf"><div class="ttname"><a href="vk__mem__alloc_8h.html#abb343b27164d08d2b97e3b0c30ecdcbf">vmaGetPoolStats</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaGetPoolStats(VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)</div><div class="ttdoc">Retrieves statistics of existing VmaPool object.</div></div>
+<div class="ttc" id="avk__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:1956</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af70dc16d3b2818d514face3ed916f492"><div class="ttname"><a href="vk__mem__alloc_8h.html#af70dc16d3b2818d514face3ed916f492">vmaCreateLostAllocation</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:1917</div></div>
+<div class="ttc" id="avk__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:1828</div></div>
+<div class="ttc" id="astruct_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:1982</div></div>
+<div class="ttc" id="avk__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="avk__mem__alloc_8h_html_a0438b3d982473eb1c93c77c7ab3212e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0438b3d982473eb1c93c77c7ab3212e1">vmaFreeMemory</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaFreeMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a27abba9dd2d1ea2026f7f4dfb548638b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a27abba9dd2d1ea2026f7f4dfb548638b">vmaCalculateStats</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaCalculateStats(VmaAllocator allocator, VmaStats *pStats)</div><div class="ttdoc">Retrieves statistics from current state of the Allocator.</div></div>
+<div class="ttc" id="avk__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:2530</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3046</div></div>
+<div class="ttc" id="astruct_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:2008</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1906</div></div>
+<div class="ttc" id="astruct_vma_budget_html"><div class="ttname"><a href="struct_vma_budget.html">VmaBudget</a></div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2149</div></div>
+<div class="ttc" id="avk__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="astruct_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:2602</div></div>
+<div class="ttc" id="avk__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:2359</div></div>
+<div class="ttc" id="avk__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:1860</div></div>
+<div class="ttc" id="astruct_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:2608</div></div>
+<div class="ttc" id="avk__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:2339</div></div>
+<div class="ttc" id="avk__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:1948</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a001bd7a2077a42caf256a6fb2f2ba131"><div class="ttname"><a href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131">vmaCreateImage</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__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="astruct_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:1847</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aab7d949b3d77783f0ba704ae5e3136e0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aab7d949b3d77783f0ba704ae5e3136e0">VMA_CALL_POST</a></div><div class="ttdeci">#define VMA_CALL_POST</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1813</div></div>
+<div class="ttc" id="avk__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:2326</div></div>
+<div class="ttc" id="astruct_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:1988</div></div>
+<div class="ttc" id="avk__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:1954</div></div>
+<div class="ttc" id="astruct_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:1922</div></div>
+<div class="ttc" id="astruct_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:2724</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a35b49cebb7d7c128db38d3949f54e325"><div class="ttname"><a href="vk__mem__alloc_8h.html#a35b49cebb7d7c128db38d3949f54e325">vmaAllocateMemoryPages</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryPages(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, size_t allocationCount, VmaAllocation *pAllocations, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation for multiple allocation objects at once.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a402558851f800ecd733800962c227f6a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a402558851f800ecd733800962c227f6a">vmaSetAllocationUserData</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:2117</div></div>
+<div class="ttc" id="astruct_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:2433</div></div>
+<div class="ttc" id="astruct_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:2123</div></div>
+<div class="ttc" id="astruct_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:1921</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a288d938ca902469760248ebd3633dde5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a288d938ca902469760248ebd3633dde5">vmaDestroyAllocator</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6e53d9caa4368576cf351300b64ef8f4"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6e53d9caa4368576cf351300b64ef8f4">vmaCheckCorruption</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__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:1765</div></div>
+<div class="ttc" id="avk__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:2370</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ada321efa19065e5a87f79dcbe11369a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#ada321efa19065e5a87f79dcbe11369a5">vmaGetMemoryProperties</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaGetMemoryProperties(VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a84dd1ecca8b0110259eb206dbadb11f6"><div class="ttname"><a href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">VmaBudget::usage</a></div><div class="ttdeci">VkDeviceSize usage</div><div class="ttdoc">Estimated current memory usage of the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2171</div></div>
+<div class="ttc" id="astruct_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="astruct_vma_vulkan_functions_html_ae5c0db8c89a3b82593dc16aa6a49fa3a"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">VmaVulkanFunctions::vkCmdCopyBuffer</a></div><div class="ttdeci">PFN_vkCmdCopyBuffer vkCmdCopyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1933</div></div>
+<div class="ttc" id="astruct_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:1976</div></div>
+<div class="ttc" id="avk__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:2300</div></div>
+<div class="ttc" id="avk__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:3032</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae98119383e8e5754b6c09679386677d3"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae98119383e8e5754b6c09679386677d3">vmaMapMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2621</div></div>
+<div class="ttc" id="avk__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:2363</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a05304fd2aa5736517feee653e1d579d1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a05304fd2aa5736517feee653e1d579d1">vmaTouchAllocation</a></div><div class="ttdeci">VMA_CALL_PRE VkBool32 VMA_CALL_POST 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="avk__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:1882</div></div>
+<div class="ttc" id="astruct_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:3126</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2354</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9681b4996d0d33ad0bc811fc7394d272"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9681b4996d0d33ad0bc811fc7394d272">vmaBindImageMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div>
+<div class="ttc" id="avk__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:2229</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aafee10cbb01be73c643ed7e02c31003f"><div class="ttname"><a href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="astruct_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:2113</div></div>
+<div class="ttc" id="astruct_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:2558</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2570</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7e70aa2a1081d849dcc7829b19d3ec9d"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">VmaDefragmentationInfo2::poolCount</a></div><div class="ttdeci">uint32_t poolCount</div><div class="ttdoc">Numer of pools in pPools array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3064</div></div>
+<div class="ttc" id="avk__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="astruct_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:2611</div></div>
+<div class="ttc" id="avk__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:1910</div></div>
+<div class="ttc" id="avk__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:1908</div></div>
+<div class="ttc" id="avk__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(). None at the moment. Reserved for future use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3031</div></div>
+<div class="ttc" id="astruct_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,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2729</div></div>
+<div class="ttc" id="avk__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:2282</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a11693ab08f65761a142c466c5eceb849"><div class="ttname"><a href="vk__mem__alloc_8h.html#a11693ab08f65761a142c466c5eceb849">vmaDestroyPool</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
+<div class="ttc" id="astruct_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:1918</div></div>
+<div class="ttc" id="avk__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:2551</div></div>
+<div class="ttc" id="astruct_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:2426</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a2c33b164a2597db181db3ca8e5812e4c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2c33b164a2597db181db3ca8e5812e4c">vmaDefragment</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2131</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a055cbf8d000a019a6270c66b46f0cb40"><div class="ttname"><a href="vk__mem__alloc_8h.html#a055cbf8d000a019a6270c66b46f0cb40">vmaBindBufferMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
+<div class="ttc" id="avk__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:2289</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1894</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aab00eabeaf43039298442591bcfba836"><div class="ttname"><a href="vk__mem__alloc_8h.html#aab00eabeaf43039298442591bcfba836">vmaFreeMemoryPages</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaFreeMemoryPages(VmaAllocator allocator, size_t allocationCount, VmaAllocation *pAllocations)</div><div class="ttdoc">Frees memory and destroys multiple allocations.</div></div>
+<div class="ttc" id="astruct_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">Reserved for future use. Should be 0.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3043</div></div>
+<div class="ttc" id="astruct_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:1926</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a7489ab3d91f0011e2ed22f266f76966c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7489ab3d91f0011e2ed22f266f76966c">vmaInvalidateAllocation</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Invalidates memory of given allocation.</div></div>
+<div class="ttc" id="astruct_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:3095</div></div>
+<div class="ttc" id="astruct_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:3130</div></div>
+<div class="ttc" id="astruct_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:2605</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3128786cae5f317f51307074a487c278"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3128786cae5f317f51307074a487c278">vmaUnmapMemory</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:1920</div></div>
+<div class="ttc" id="avk__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:1958</div></div>
+<div class="ttc" id="avk__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:2261</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a0b3effd57f3fcdeb2ed62210b4ef20e1"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">VmaDefragmentationInfo2::pPools</a></div><div class="ttdeci">VmaPool * pPools</div><div class="ttdoc">Either null or pointer to array of pools to be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3080</div></div>
+<div class="ttc" id="astruct_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="avk__mem__alloc_8h_html_a3fa3daa743fcc950253f676aa8a323ea"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3fa3daa743fcc950253f676aa8a323ea">vmaDestroyBuffer</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="astruct_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:2052</div></div>
+<div class="ttc" id="astruct_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:1925</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a236c3299ad132eb753dbcbf6e309849e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a236c3299ad132eb753dbcbf6e309849e">vmaGetPhysicalDeviceProperties</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaGetPhysicalDeviceProperties(VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a2d9ae6d97e48d85f5b6a685742d5f6f0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2d9ae6d97e48d85f5b6a685742d5f6f0">vmaGetBudget</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaGetBudget(VmaAllocator allocator, VmaBudget *pBudget)</div><div class="ttdoc">Retrieves information about current memory budget for all memory heaps.</div></div>
+<div class="ttc" id="astruct_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:1927</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af2bacace15ecc6886e4e4de5d1b77e4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aff001c5ec4ab2aeef3176804d6a865a9"><div class="ttname"><a href="vk__mem__alloc_8h.html#aff001c5ec4ab2aeef3176804d6a865a9">vmaFreeStatsString</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaFreeStatsString(VmaAllocator allocator, char *pStatsString)</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3109</div></div>
+<div class="ttc" id="avk__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:1834</div></div>
+<div class="ttc" id="astruct_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:2127</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a21530f0bd74d92b40cc1873e5037662c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a21530f0bd74d92b40cc1873e5037662c">vmaFindMemoryTypeIndex</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2575</div></div>
+<div class="ttc" id="astruct_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:2110</div></div>
+<div class="ttc" id="astruct_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:3134</div></div>
+<div class="ttc" id="avk__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="avk__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="avk__mem__alloc_8h_html_a3f0fa870030b4d421bf71e3928d5fe31"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3f0fa870030b4d421bf71e3928d5fe31">VMA_CALL_PRE</a></div><div class="ttdeci">#define VMA_CALL_PRE</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1810</div></div>
+<div class="ttc" id="avk__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="avk__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:2251</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5e9d96ef2cbd8263cc523da91d1b40c9"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5e9d96ef2cbd8263cc523da91d1b40c9">vmaDefragmentationEnd</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
+<div class="ttc" id="astruct_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:2121</div></div>
+<div class="ttc" id="astruct_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:2119</div></div>
+<div class="ttc" id="astruct_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:1991</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aaf235cb916f4c56feafdce45227fd17a"><div class="ttname"><a href="vk__mem__alloc_8h.html#aaf235cb916f4c56feafdce45227fd17a">vmaMakePoolAllocationsLost</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="avk__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:1855</div></div>
+<div class="ttc" id="astruct_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:2583</div></div>
+<div class="ttc" id="astruct_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:2555</div></div>
+<div class="ttc" id="astruct_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:1849</div></div>
+<div class="ttc" id="avk__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="astruct_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="avk__mem__alloc_8h_html_ab79b48b6d25aada0de91a913896e1c38"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab79b48b6d25aada0de91a913896e1c38">VmaBudget</a></div><div class="ttdeci">struct VmaBudget VmaBudget</div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div></div>
+<div class="ttc" id="avk__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:2277</div></div>
+<div class="ttc" id="avk__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:2333</div></div>
+<div class="ttc" id="astruct_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:2561</div></div>
+<div class="ttc" id="avk__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:2278</div></div>
+<div class="ttc" id="astruct_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:2115</div></div>
+<div class="ttc" id="astruct_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:1924</div></div>
+<div class="ttc" id="astruct_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:3040</div></div>
+<div class="ttc" id="astruct_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:3121</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a58b492901baab685f466199124e514a0"><div class="ttname"><a href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">VmaBudget::blockBytes</a></div><div class="ttdeci">VkDeviceSize blockBytes</div><div class="ttdoc">Sum size of all VkDeviceMemory blocks allocated from particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2153</div></div>
+<div class="ttc" id="avk__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:2549</div></div>
+<div class="ttc" id="astruct_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:2407</div></div>
+<div class="ttc" id="avk__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:2380</div></div>
+<div class="ttc" id="astruct_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:2122</div></div>
+<div class="ttc" id="astruct_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:1994</div></div>
+<div class="ttc" id="avk__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:2384</div></div>
+<div class="ttc" id="astruct_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:1985</div></div>
+<div class="ttc" id="avk__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="avk__mem__alloc_8h_html_ad0b03b51a0dff5dab25ac9c194fef3e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad0b03b51a0dff5dab25ac9c194fef3e1">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:2033</div></div>
+<div class="ttc" id="astruct_vma_budget_html_ab82e1d1754c2d210d0bdf90220bc6cdd"><div class="ttname"><a href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">VmaBudget::budget</a></div><div class="ttdeci">VkDeviceSize budget</div><div class="ttdoc">Estimated amount of memory available to the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2182</div></div>
+<div class="ttc" id="astruct_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:1916</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa06d8fe2e969c048182e019f4b857ccf"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa06d8fe2e969c048182e019f4b857ccf">vmaBindBufferMemory2</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</div><div class="ttdoc">Binds buffer to allocation with additional parameters.</div></div>
+<div class="ttc" id="astruct_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:2743</div></div>
+<div class="ttc" id="astruct_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:1979</div></div>
+<div class="ttc" id="avk__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:3034</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aca66f515fb5c3b370eaa9d826785c2c6"><div class="ttname"><a href="vk__mem__alloc_8h.html#aca66f515fb5c3b370eaa9d826785c2c6">vmaFlushAllocation</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaFlushAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Flushes memory of given allocation.</div></div>
+<div class="ttc" id="astruct_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:1931</div></div>
+<div class="ttc" id="astruct_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:2123</div></div>
+<div class="ttc" id="avk__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:2268</div></div>
+<div class="ttc" id="avk__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="avk__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:2377</div></div>
+<div class="ttc" id="avk__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:2374</div></div>
+<div class="ttc" id="astruct_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:2402</div></div>
+<div class="ttc" id="astruct_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:2122</div></div>
+<div class="ttc" id="astruct_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:2734</div></div>
+<div class="ttc" id="astruct_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:1964</div></div>
+<div class="ttc" id="astruct_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:1923</div></div>
+<div class="ttc" id="astruct_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:2748</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af34f6d2ec25537ac0179ff614bae0012"><div class="ttname"><a href="vk__mem__alloc_8h.html#af34f6d2ec25537ac0179ff614bae0012">vmaAllocateMemoryForBuffer</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemoryForBuffer(VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__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:2513</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6e40022ab443f88bfa8b13c2fcfd05cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6e40022ab443f88bfa8b13c2fcfd05cc">vmaAllocateMemory</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="astruct_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:2130</div></div>
+<div class="ttc" id="astruct_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:2045</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a763d86a0fa9613d81b19dc724d418f67"><div class="ttname"><a href="vk__mem__alloc_8h.html#a763d86a0fa9613d81b19dc724d418f67">vmaSetCurrentFrameIndex</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaSetCurrentFrameIndex(VmaAllocator allocator, uint32_t frameIndex)</div><div class="ttdoc">Sets index of the current frame.</div></div>
+<div class="ttc" id="astruct_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:2624</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a359c5187b7004880945f0e3debba91b9"><div class="ttname"><a href="vk__mem__alloc_8h.html#a359c5187b7004880945f0e3debba91b9">vmaFindMemoryTypeIndexForImageInfo</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__mem__alloc_8h_html_a696fc71963b7711cc0db3cc2225d0cd7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a696fc71963b7711cc0db3cc2225d0cd7">vmaDefragmentationBegin</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
+<div class="ttc" id="avk__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:2391</div></div>
+<div class="ttc" id="astruct_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:2129</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Optional handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2057</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aee3406ab6b195cd85207ca2ef2d13a57"><div class="ttname"><a href="vk__mem__alloc_8h.html#aee3406ab6b195cd85207ca2ef2d13a57">vmaCreatePool</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__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="avk__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:2234</div></div>
+<div class="ttc" id="astruct_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:3100</div></div>
+<div class="ttc" id="astruct_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:1930</div></div>
+<div class="ttc" id="astruct_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:2597</div></div>
+<div class="ttc" id="astruct_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:1932</div></div>
+<div class="ttc" id="astruct_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:3085</div></div>
+<div class="ttc" id="astruct_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:2715</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6d7d34a7e2ef515a2734bdfdf7a76a9f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6d7d34a7e2ef515a2734bdfdf7a76a9f">vmaDestroyImage</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST vmaDestroyImage(VmaAllocator allocator, VkImage image, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan image and frees allocated memory.</div></div>
+<div class="ttc" id="avk__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:2313</div></div>
+<div class="ttc" id="astruct_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:1929</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6bdc403637fe34c4dbb7f7de39357e02"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6bdc403637fe34c4dbb7f7de39357e02">vmaCheckPoolCorruption</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__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="astruct_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:2614</div></div>
+<div class="ttc" id="avk__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:2495</div></div>
+<div class="ttc" id="astruct_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:3132</div></div>
+<div class="ttc" id="astruct_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:2123</div></div>
+<div class="ttc" id="avk__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:2344</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a25e3b30b93063b921d5078e538b1bf30"><div class="ttname"><a href="vk__mem__alloc_8h.html#a25e3b30b93063b921d5078e538b1bf30">vmaAllocateMemoryForImage</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST 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="avk__mem__alloc_8h_html_a4d7fc62aef0239d260e647447605aad4"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4d7fc62aef0239d260e647447605aad4">vmaBuildStatsString</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="astruct_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:2396</div></div>
+<div class="ttc" id="astruct_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:1928</div></div>
+<div class="ttc" id="astruct_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:2393</div></div>
+<div class="ttc" id="astruct_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:2412</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a82e760a2db3b517b965320ba71ebbfbb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a82e760a2db3b517b965320ba71ebbfbb">vmaBindImageMemory2</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</div><div class="ttdoc">Binds image to allocation with additional parameters.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a36e0067f27609620651eefdf98ce624e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36e0067f27609620651eefdf98ce624e">vmaResizeAllocation</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaResizeAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize newSize)</div><div class="ttdoc">Deprecated.</div></div>
+<div class="ttc" id="astruct_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:3061</div></div>
+<div class="ttc" id="astruct_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:3136</div></div>
+<div class="ttc" id="astruct_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:2420</div></div>
+<div class="ttc" id="astruct_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:3138</div></div>
+<div class="ttc" id="astruct_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:1972</div></div>
+<div class="ttc" id="astruct_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:2122</div></div>
+<div class="ttc" id="avk__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="astruct_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:2710</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae10b53588f197141c6e88a1f5ec34789"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae10b53588f197141c6e88a1f5ec34789">vmaGetAllocationInfo</a></div><div class="ttdeci">VMA_CALL_PRE void VMA_CALL_POST 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="avk__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:2541</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a7e2a6583ebd63e194951c542563804d8"><div class="ttname"><a href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">VmaBudget::allocationBytes</a></div><div class="ttdeci">VkDeviceSize allocationBytes</div><div class="ttdoc">Sum size of all allocations created in particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2161</div></div>
+<div class="ttc" id="avk__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:2389</div></div>
+<div class="ttc" id="astruct_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="astruct_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:3055</div></div>
+<div class="ttc" id="avk__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:2545</div></div>
+<div class="ttc" id="astruct_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:3090</div></div>
+<div class="ttc" id="astruct_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:3116</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2350</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/docs/html/vk_khr_dedicated_allocation.html b/docs/html/vk_khr_dedicated_allocation.html
index 82387e6..8b1ac00 100644
--- a/docs/html/vk_khr_dedicated_allocation.html
+++ b/docs/html/vk_khr_dedicated_allocation.html
@@ -3,7 +3,7 @@
 <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.15"/>
+<meta name="generator" content="Doxygen 1.8.16"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VK_KHR_dedicated_allocation</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,7 +29,7 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.15 -->
+<!-- Generated by Doxygen 1.8.16 -->
 <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');
@@ -59,10 +59,6 @@
 </iframe>
 </div>
 
-<div id="nav-path" class="navpath">
-  <ul>
-<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
-</div>
 </div><!-- top -->
 <div class="PageDoc"><div class="header">
   <div class="headertitle">
@@ -78,7 +74,10 @@
 </ul>
 <p>If you enabled these extensions:</p>
 <p>2 . Use <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878" title="Enables usage of VK_KHR_dedicated_allocation extension.">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> flag when creating your <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>`to inform the library that you enabled required extensions and you want the library to use them.</p>
-<div class="fragment"><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>;</div><div class="line"></div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div></div><!-- fragment --><p>That's all. The extension will be automatically used whenever you create a buffer using <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> or image using <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>.</p>
+<div class="fragment"><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div>
+</div><!-- fragment --><p>That's all. The extension will be automatically used whenever you create a buffer using <a class="el" href="vk__mem__alloc_8h.html#aafee10cbb01be73c643ed7e02c31003f">vmaCreateBuffer()</a> or image using <a class="el" href="vk__mem__alloc_8h.html#a001bd7a2077a42caf256a6fb2f2ba131" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>.</p>
 <p>When using the extension together with Vulkan Validation Layer, you will receive warnings like this: </p><pre class="fragment">vkBindBufferMemory(): Binding memory to buffer 0x33 but vkGetBufferMemoryRequirements() has not been called on that buffer.
 </pre><p>It is OK, you should just ignore it. It happens because you use function <code>vkGetBufferMemoryRequirements2KHR()</code> instead of standard <code>vkGetBufferMemoryRequirements()</code>, while the validation layer seems to be unaware of it.</p>
 <p>To learn more about this extension, see:</p>
@@ -86,13 +85,16 @@
 <li><a href="https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_KHR_dedicated_allocation">VK_KHR_dedicated_allocation in Vulkan specification</a></li>
 <li><a href="http://asawicki.info/articles/VK_KHR_dedicated_allocation.php5">VK_KHR_dedicated_allocation unofficial manual</a> </li>
 </ul>
-</div></div><!-- PageDoc -->
-</div><!-- contents -->
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<div class="ttc" id="avk__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:1882</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af2bacace15ecc6886e4e4de5d1b77e4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#af2bacace15ecc6886e4e4de5d1b77e4d">vmaCreateAllocator</a></div><div class="ttdeci">VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+<div class="ttc" id="astruct_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:1979</div></div>
 <!-- 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.15
+</a> 1.8.16
 </small></address>
 </body>
 </html>
diff --git a/src/Doxyfile b/src/Doxyfile
index 6755f30..3efbdb9 100644
--- a/src/Doxyfile
+++ b/src/Doxyfile
@@ -2148,7 +2148,7 @@
 # The default value is: NO.

 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

 

-MACRO_EXPANSION        = NO

+MACRO_EXPANSION        = YES

 

 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then

 # the macro expansion is limited to the macros specified with the PREDEFINED and

@@ -2156,7 +2156,7 @@
 # The default value is: NO.

 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

 

-EXPAND_ONLY_PREDEF     = NO

+EXPAND_ONLY_PREDEF     = YES

 

 # If the SEARCH_INCLUDES tag is set to YES, the include files in the

 # INCLUDE_PATH will be searched if a #include is found.

@@ -2188,7 +2188,7 @@
 # recursively expanded use the := operator instead of the = operator.

 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

 

-PREDEFINED             =

+PREDEFINED             = VMA_CALL_PRE= VMA_CALL_POST=

 

 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this

 # tag can be used to specify a list of macro names that should be expanded. The

diff --git a/src/Tests.cpp b/src/Tests.cpp
index efa109e..82100fd 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -179,6 +179,13 @@
     VmaAllocation Allocation = VK_NULL_HANDLE;

 };

 

+static uint32_t MemoryTypeToHeap(uint32_t memoryTypeIndex)

+{

+    const VkPhysicalDeviceMemoryProperties* props;

+    vmaGetMemoryProperties(g_hAllocator, &props);

+    return props->memoryTypes[memoryTypeIndex].heapIndex;

+}

+

 static uint32_t GetAllocationStrategyCount()

 {

     uint32_t strategyCount = 0;

@@ -3862,6 +3869,86 @@
         return true;

 }

 

+static void TestBudget()

+{

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

+

+    uint32_t memTypeIndex = UINT32_MAX;

+

+    static const VkDeviceSize BUF_SIZE = 100ull * 1024 * 1024;

+    static const uint32_t BUF_COUNT = 4;

+

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

+    {

+        vmaSetCurrentFrameIndex(g_hAllocator, ++g_FrameIndex);

+

+        VmaBudget budgetBeg[VK_MAX_MEMORY_HEAPS] = {};

+        vmaGetBudget(g_hAllocator, budgetBeg);

+

+        VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufInfo.size = BUF_SIZE;

+        bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+    

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+        if(testIndex == 0)

+        {

+            allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+        }

+

+        // CREATE BUFFERS

+        uint32_t heapIndex = 0;

+        BufferInfo bufInfos[BUF_COUNT] = {};

+        for(uint32_t bufIndex = 0; bufIndex < BUF_COUNT; ++bufIndex)

+        {

+            VmaAllocationInfo allocInfo;

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

+                &bufInfos[bufIndex].Buffer, &bufInfos[bufIndex].Allocation, &allocInfo);

+            TEST(res == VK_SUCCESS);

+            if(bufIndex == 0)

+            {

+                heapIndex = MemoryTypeToHeap(allocInfo.memoryType);

+            }

+            else

+            {

+                // All buffers need to fall into the same heap.

+                TEST(MemoryTypeToHeap(allocInfo.memoryType) == heapIndex);

+            }

+        }

+

+        VmaBudget budgetWithBufs[VK_MAX_MEMORY_HEAPS] = {};

+        vmaGetBudget(g_hAllocator, budgetWithBufs);

+

+        // DESTROY BUFFERS

+        for(size_t bufIndex = BUF_COUNT; bufIndex--; )

+        {

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

+        }

+

+        VmaBudget budgetEnd[VK_MAX_MEMORY_HEAPS] = {};

+        vmaGetBudget(g_hAllocator, budgetEnd);

+

+        // CHECK

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

+        {

+            TEST(budgetEnd[i].allocationBytes <= budgetEnd[i].blockBytes);

+            if(i == heapIndex)

+            {

+                TEST(budgetEnd[i].allocationBytes == budgetBeg[i].allocationBytes);

+                TEST(budgetWithBufs[i].allocationBytes == budgetBeg[i].allocationBytes + BUF_SIZE * BUF_COUNT);

+                TEST(budgetWithBufs[i].blockBytes >= budgetEnd[i].blockBytes);

+            }

+            else

+            {

+                TEST(budgetEnd[i].allocationBytes == budgetEnd[i].allocationBytes &&

+                    budgetEnd[i].allocationBytes == budgetWithBufs[i].allocationBytes);

+                TEST(budgetEnd[i].blockBytes == budgetEnd[i].blockBytes &&

+                    budgetEnd[i].blockBytes == budgetWithBufs[i].blockBytes);

+            }

+        }

+    }

+}

+

 static void TestMapping()

 {

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

@@ -3891,15 +3978,15 @@
         VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

         bufInfo.size = 0x10000;

         bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

-    

+

         VmaAllocationCreateInfo allocCreateInfo = {};

         allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

         allocCreateInfo.pool = pool;

         if(testIndex == TEST_DEDICATED)

             allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

-    

+

         VmaAllocationInfo allocInfo;

-    

+

         // Mapped manually

 

         // Create 2 buffers.

@@ -3912,7 +3999,7 @@
             TEST(allocInfo.pMappedData == nullptr);

             memTypeIndex = allocInfo.memoryType;

         }

-    

+

         // Map buffer 0.

         char* data00 = nullptr;

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

@@ -5109,6 +5196,7 @@
 #if VMA_DEBUG_INITIALIZE_ALLOCATIONS

     TestAllocationsInitialization();

 #endif

+    TestBudget();

     TestMapping();

     TestDeviceLocalMapped();

     TestMappingMultithreaded();

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index 6f0db10..8a533a3 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -47,8 +47,10 @@
 

 static bool g_EnableValidationLayer = true;

 static bool VK_KHR_get_memory_requirements2_enabled = false;

+static bool VK_KHR_get_physical_device_properties2_enabled = false;

 static bool VK_KHR_dedicated_allocation_enabled = false;

 static bool VK_KHR_bind_memory2_enabled = false;

+static bool VK_EXT_memory_budget_enabled = false;

 bool g_SparseBindingEnabled = false;

 

 static HINSTANCE g_hAppInstance;

@@ -1137,15 +1139,32 @@
         }

     }

 

-    std::vector<const char*> instanceExtensions;

-    instanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);

-    instanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);

+    uint32_t availableInstanceExtensionCount = 0;

+    ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, nullptr) );

+    std::vector<VkExtensionProperties> availableInstanceExtensions(availableInstanceExtensionCount);

+    if(availableInstanceExtensionCount > 0)

+    {

+        ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, availableInstanceExtensions.data()) );

+    }

+

+    std::vector<const char*> enabledInstanceExtensions;

+    enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);

+    enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);

 

     std::vector<const char*> instanceLayers;

     if(g_EnableValidationLayer == true)

     {

         instanceLayers.push_back(VALIDATION_LAYER_NAME);

-        instanceExtensions.push_back("VK_EXT_debug_report");

+        enabledInstanceExtensions.push_back("VK_EXT_debug_report");

+    }

+

+    for(const auto& extensionProperties : availableInstanceExtensions)

+    {

+        if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)

+        {

+            enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);

+            VK_KHR_get_physical_device_properties2_enabled = true;

+        }

     }

 

     VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };

@@ -1157,8 +1176,8 @@
 

     VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };

     instInfo.pApplicationInfo = &appInfo;

-    instInfo.enabledExtensionCount = static_cast<uint32_t>(instanceExtensions.size());

-    instInfo.ppEnabledExtensionNames = instanceExtensions.data();

+    instInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());

+    instInfo.ppEnabledExtensionNames = enabledInstanceExtensions.data();

     instInfo.enabledLayerCount = static_cast<uint32_t>(instanceLayers.size());

     instInfo.ppEnabledLayerNames = instanceLayers.data();

 

@@ -1304,6 +1323,11 @@
                     enabledDeviceExtensions.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);

                     VK_KHR_bind_memory2_enabled = true;

                 }

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

+                {

+                    enabledDeviceExtensions.push_back(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME);

+                    VK_EXT_memory_budget_enabled = true;

+                }

             }

         }

     }

@@ -1324,6 +1348,7 @@
     VmaAllocatorCreateInfo allocatorInfo = {};

     allocatorInfo.physicalDevice = g_hPhysicalDevice;

     allocatorInfo.device = g_hDevice;

+    allocatorInfo.instance = g_hVulkanInstance;

 

     if(VK_KHR_dedicated_allocation_enabled)

     {

@@ -1344,6 +1369,10 @@
     {

         allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT;

     }

+    if(VK_EXT_memory_budget_enabled && VK_KHR_get_physical_device_properties2_enabled)

+    {

+        allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;

+    }

 

     if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)

     {

@@ -1359,6 +1388,14 @@
     }

     */

 

+    // Uncomment to enable HeapSizeLimit.

+    /*

+    std::array<VkDeviceSize, VK_MAX_MEMORY_HEAPS> heapSizeLimit;

+    std::fill(heapSizeLimit.begin(), heapSizeLimit.end(), VK_WHOLE_SIZE);

+    heapSizeLimit[0] = 512ull * 1024 * 1024;

+    allocatorInfo.pHeapSizeLimit = heapSizeLimit.data();

+    */

+

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

 

     // Retrieve queues (don't need to be destroyed).

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index f85897e..952fe24 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -29,9 +29,9 @@
 

 /** \mainpage Vulkan Memory Allocator

 

-<b>Version 2.3.0-development</b> (2019-07-02)

+<b>Version 2.3.0-development</b> (2019-11-02)

 

-Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved. \n

+Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. \n

 License: MIT

 

 Documentation of all members: vk_mem_alloc.h

@@ -54,6 +54,9 @@
     - [Persistently mapped memory](@ref memory_mapping_persistently_mapped_memory)

     - [Cache control](@ref memory_mapping_cache_control)

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

+  - \subpage staying_within_budget

+    - [Querying for budget](@ref staying_within_budget_querying_for_budget)

+    - [Controlling memory usage](@ref staying_within_budget_controlling_memory_usage)

   - \subpage custom_memory_pools

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

     - [Linear allocation algorithm](@ref linear_algorithm)

@@ -523,6 +526,78 @@
 \endcode

 

 

+\page staying_within_budget Staying within budget

+

+When developing a graphics-intensive game or program, it is important to avoid allocating

+more GPU memory than it's physically available. When the memory is over-committed,

+various bad things can happen, depending on the specific GPU, graphics driver, and

+operating system:

+

+- It may just work without any problems.

+- The application may slow down because some memory blocks are moved to system RAM

+  and the GPU has to access them through PCI Express bus.

+- A new allocation may take very long time to complete, even few seconds, and possibly

+  freeze entire system.

+- The new allocation may fail with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+- It may even result in GPU crash (TDR), observed as `VK_ERROR_DEVICE_LOST`

+  returned somewhere later.

+

+\section staying_within_budget_querying_for_budget Querying for budget

+

+To query for current memory usage and available budget, use function vmaGetBudget().

+Returned structure #VmaBudget contains quantities expressed in bytes, per Vulkan memory heap.

+

+Please note that this function returns different information and works faster than

+vmaCalculateStats(). vmaGetBudget() can be called every frame or even before every

+allocation, while vmaCalculateStats() is intended to be used rarely,

+only to obtain statistical information, e.g. for debugging purposes.

+

+It is recommended to use <b>VK_EXT_memory_budget</b> device extension to obtain information

+about the budget from Vulkan device. VMA is able to use this extension automatically.

+When not enabled, the allocator behaves same way, but then it estimates current usage

+and available budget based on its internal information and Vulkan memory heap sizes,

+which may be less precise. In order to use this extension:

+

+1. Make sure extensions VK_EXT_memory_budget and VK_KHR_get_physical_device_properties2

+   required by it are available and enable them. Please note that the first is a device

+   extension and the second is instance extension!

+2. Use flag #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT when creating #VmaAllocator object.

+3. Make sure to call vmaSetCurrentFrameIndex() every frame. Budget is queried from

+   Vulkan inside of it to avoid overhead of querying it with every allocation.

+

+\section staying_within_budget_controlling_memory_usage Controlling memory usage

+

+There are many ways in which you can try to stay within the budget.

+

+First, when making new allocation requires allocating a new memory block, the library

+tries not to exceed the budget automatically. If a block with default recommended size

+(e.g. 256 MB) would go over budget, a smaller block is allocated, possibly even

+dedicated memory for just this resource.

+

+If the size of the requested resource plus current memory usage is more than the

+budget, by default the library still tries to create it, leaving it to the Vulkan

+implementation whether the allocation succeeds or fails. You can change this behavior

+by using #VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT flag. With it, the allocation is

+not made if it would exceed the budget or if the budget is already exceeded.

+Some other allocations become lost instead to make room for it, if the mechanism of

+[lost allocations](@ref lost_allocations) is used.

+If that is not possible, the allocation fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+Example usage pattern may be to pass the #VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT flag

+when creating resources that are not essential for the application (e.g. the texture

+of a specific object) and not to pass it when creating critically important resources

+(e.g. render targets).

+

+Finally, you can also use #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT flag to make sure

+a new allocation is created only when it fits inside one of the existing memory blocks.

+If it would require to allocate a new block, if fails instead with `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+This also ensures that the function call is very fast because it never goes to Vulkan

+to obtain a new block.

+

+Please note that creating \ref custom_memory_pools with VmaPoolCreateInfo::minBlockCount

+set to more than 0 will try to allocate memory blocks without checking whether they

+fit within budget.

+

+

 \page custom_memory_pools Custom memory pools

 

 A memory pool contains a number of `VkDeviceMemory` blocks.

@@ -1718,6 +1793,14 @@
     #endif

 #endif

 

+#if !defined(VMA_MEMORY_BUDGET)

+    #if VK_EXT_memory_budget && VK_KHR_get_physical_device_properties2

+        #define VMA_MEMORY_BUDGET 1

+    #else

+        #define VMA_MEMORY_BUDGET 0

+    #endif

+#endif

+

 // Define these macros to decorate all public functions with additional code,

 // before and after returned type, appropriately. This may be useful for

 // exporing the functions when compiling VMA as a separate library. Example:

@@ -1788,8 +1871,8 @@
     VmaAllocatorCreateInfo::device, and you want them to be used internally by this

     library:

 

-    - VK_KHR_get_memory_requirements2

-    - VK_KHR_dedicated_allocation

+    - VK_KHR_get_memory_requirements2 (device extension)

+    - VK_KHR_dedicated_allocation (device extension)

 

     When this flag is set, you can experience following warnings reported by Vulkan

     validation layer. You can ignore them.

@@ -1809,6 +1892,18 @@
     This flag is required if you use `pNext` parameter in vmaBindBufferMemory2() or vmaBindImageMemory2().

     */

     VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT = 0x00000004,

+    /**

+    Enables usage of VK_EXT_memory_budget extension.

+

+    You may set this flag only if you found out that this device extension is supported,

+    you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,

+    and you want it to be used internally by this library, along with another instance extension

+    VK_KHR_get_physical_device_properties2, which is required by it.

+

+    The extension provides query for current memory usage and budget, which will probably

+    be more accurate than an estimation used by the library otherwise.

+    */

+    VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT = 0x00000008,

 

     VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF

 } VmaAllocatorCreateFlagBits;

@@ -1844,6 +1939,9 @@
     PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;

     PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;

 #endif

+#if VMA_MEMORY_BUDGET

+    PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;

+#endif

 } VmaVulkanFunctions;

 

 /// Flags to be used in VmaRecordSettings::flags.

@@ -1952,6 +2050,11 @@
     creation of the allocator object fails with `VK_ERROR_FEATURE_NOT_PRESENT`.

     */

     const VmaRecordSettings* pRecordSettings;

+    /** \brief Optional handle to Vulkan instance object.

+

+    Optional, can be null. Must be set if #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT flas is used.

+    */

+    VkInstance instance;

 } VmaAllocatorCreateInfo;

 

 /// Creates Allocator object.

@@ -2028,11 +2131,71 @@
     VmaStatInfo total;

 } VmaStats;

 

-/// Retrieves statistics from current state of the Allocator.

+/** \brief Retrieves statistics from current state of the Allocator.

+

+This function is called "calculate" not "get" because it has to traverse all

+internal data structures, so it may be quite slow. For faster but more brief statistics

+suitable to be called every frame or every allocation, use vmaGetBudget().

+

+Note that when using allocator from multiple threads, returned information may immediately

+become outdated.

+*/

 VMA_CALL_PRE void VMA_CALL_POST vmaCalculateStats(

     VmaAllocator allocator,

     VmaStats* pStats);

 

+/** \brief Statistics of current memory usage and available budget, in bytes, for specific memory heap.

+*/

+typedef struct VmaBudget

+{

+    /** \brief Sum size of all `VkDeviceMemory` blocks allocated from particular heap, in bytes.

+    */

+    VkDeviceSize blockBytes;

+    

+    /** \brief Sum size of all allocations created in particular heap, in bytes.

+    

+    Always less or equal than `blockBytes`.

+    Difference `blockBytes - allocationBytes` is the amount of memory allocated but unused -

+    available for new allocations or wasted due to fragmentation.

+    */

+    VkDeviceSize allocationBytes;

+    

+    /** \brief Estimated current memory usage of the program, in bytes.

+    

+    Fetched from system using `VK_EXT_memory_budget` extension if enabled.

+    

+    It might be different than `blockBytes` (usually higher) due to additional implicit objects

+    also occupying the memory, like swapchain, pipelines, descriptor heaps, command buffers, or

+    `VkDeviceMemory` blocks allocated outside of this library, if any.

+    */

+    VkDeviceSize usage;

+    

+    /** \brief Estimated amount of memory available to the program, in bytes.

+    

+    Fetched from system using `VK_EXT_memory_budget` extension if enabled.

+    

+    It might be different (most probably smaller) than `VkMemoryHeap::size[heapIndex]` due to factors

+    external to the program, like other programs also consuming system resources.

+    Difference `budget - usage` is the amount of additional memory that can probably

+    be allocated without problems. Exceeding the budget may result in various problems.

+    */

+    VkDeviceSize budget;

+} VmaBudget;

+

+/** \brief Retrieves information about current memory budget for all memory heaps.

+

+\param[out] pBudget Must point to array with number of elements at least equal to number of memory heaps in physical device used.

+

+This function is called "get" not "calculate" because it is very fast, suitable to be called

+every frame or every allocation. For more detailed statistics use vmaCalculateStats().

+

+Note that when using allocator from multiple threads, returned information may immediately

+become outdated.

+*/

+VMA_CALL_PRE void VMA_CALL_POST vmaGetBudget(

+    VmaAllocator allocator,

+    VmaBudget* pBudget);

+

 #ifndef VMA_STATS_STRING_ENABLED

 #define VMA_STATS_STRING_ENABLED 1

 #endif

@@ -2185,6 +2348,10 @@
     Otherwise it is ignored.

     */

     VMA_ALLOCATION_CREATE_DONT_BIND_BIT = 0x00000080,

+    /** Create allocation only if additional device memory required for it, if any, won't exceed

+    memory budget. Otherwise return `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+    */

+    VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT = 0x00000100,

 

     /** Allocation strategy that chooses smallest possible free range for the

     allocation.

@@ -3498,18 +3665,18 @@
 #endif // #ifndef VMA_RW_MUTEX

 

 /*

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

-

-- Constructor(uint32_t desired)

-- uint32_t load() const

-- void store(uint32_t desired)

-- bool compare_exchange_weak(uint32_t& expected, uint32_t desired)

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

 */

 #ifndef VMA_ATOMIC_UINT32

     #include <atomic>

     #define VMA_ATOMIC_UINT32 std::atomic<uint32_t>

 #endif

 

+#ifndef VMA_ATOMIC_UINT64

+    #include <atomic>

+    #define VMA_ATOMIC_UINT64 std::atomic<uint64_t>

+#endif

+

 #ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY

     /**

     Every allocation will have its own memory block.

@@ -6061,8 +6228,7 @@
         size_t allocationCount,

         VmaAllocation* pAllocations);

 

-    void Free(

-        VmaAllocation hAllocation);

+    void Free(const VmaAllocation hAllocation);

 

     // Adds statistics of this BlockVector to pStats.

     void AddStats(VmaStats* pStats);

@@ -6769,6 +6935,38 @@
     VmaPoolAllocator<VmaAllocation_T> m_Allocator;

 };

 

+struct VmaCurrentBudgetData

+{

+    VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];

+    VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];

+

+#if VMA_MEMORY_BUDGET

+    VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;

+    VMA_RW_MUTEX m_BudgetMutex;

+    uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];

+    uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];

+    uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];

+#endif // #if VMA_MEMORY_BUDGET

+

+    VmaCurrentBudgetData()

+    {

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

+        {

+            m_BlockBytes[heapIndex] = 0;

+            m_AllocationBytes[heapIndex] = 0;

+#if VMA_MEMORY_BUDGET

+            m_VulkanUsage[heapIndex] = 0;

+            m_VulkanBudget[heapIndex] = 0;

+            m_BlockBytesAtBudgetFetch[heapIndex] = 0;

+#endif

+        }

+

+#if VMA_MEMORY_BUDGET

+        m_OperationsSinceBudgetFetch = 0;

+#endif

+    }

+};

+

 // Main allocator object.

 struct VmaAllocator_T

 {

@@ -6777,15 +6975,16 @@
     bool m_UseMutex;

     bool m_UseKhrDedicatedAllocation;

     bool m_UseKhrBindMemory2;

+    bool m_UseExtMemoryBudget;

     VkDevice m_hDevice;

+    VkInstance m_hInstance;

     bool m_AllocationCallbacksSpecified;

     VkAllocationCallbacks m_AllocationCallbacks;

     VmaDeviceMemoryCallbacks m_DeviceMemoryCallbacks;

     VmaAllocationObjectAllocator m_AllocationObjectAllocator;

     

-    // 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;

+    // Each bit (1 << i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.

+    uint32_t m_HeapSizeLimitMask;

 

     VkPhysicalDeviceProperties m_PhysicalDeviceProperties;

     VkPhysicalDeviceMemoryProperties m_MemProps;

@@ -6798,6 +6997,8 @@
     AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];

     VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];

 

+    VmaCurrentBudgetData m_Budget;

+

     VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo);

     VkResult Init(const VmaAllocatorCreateInfo* pCreateInfo);

     ~VmaAllocator_T();

@@ -6883,6 +7084,9 @@
 

     void CalculateStats(VmaStats* pStats);

 

+    void GetBudget(

+        VmaBudget* outBudget, uint32_t firstHeap, uint32_t heapCount);

+

 #if VMA_STATS_STRING_ENABLED

     void PrintDetailedMap(class VmaJsonWriter& json);

 #endif

@@ -7006,6 +7210,7 @@
         VkDeviceSize size,

         VmaSuballocationType suballocType,

         uint32_t memTypeIndex,

+        bool withinBudget,

         bool map,

         bool isUserDataString,

         void* pUserData,

@@ -7014,13 +7219,17 @@
         size_t allocationCount,

         VmaAllocation* pAllocations);

 

-    void FreeDedicatedMemory(VmaAllocation allocation);

+    void FreeDedicatedMemory(const VmaAllocation allocation);

 

     /*

     Calculates and returns bit mask of memory types that can support defragmentation

     on GPU as they support creation of required buffer for copy operations.

     */

     uint32_t CalculateGpuDefragmentationMemoryTypeBits() const;

+

+#if VMA_MEMORY_BUDGET

+    void UpdateVulkanBudget();

+#endif // #if VMA_MEMORY_BUDGET

 };

 

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

@@ -11620,9 +11829,20 @@
     bool canMakeOtherLost = (createInfo.flags & VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT) != 0;

     const bool mapped = (createInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0;

     const bool isUserDataString = (createInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0;

+    

+    const bool withinBudget = (createInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0;

+    VkDeviceSize freeMemory;

+    {

+        const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);

+        VmaBudget heapBudget = {};

+        m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);

+        freeMemory = (heapBudget.usage < heapBudget.budget) ? (heapBudget.budget - heapBudget.usage) : 0;

+    }

+    

     const bool canCreateNewBlock =

         ((createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) == 0) &&

-        (m_Blocks.size() < m_MaxBlockCount);

+        (m_Blocks.size() < m_MaxBlockCount) &&

+        freeMemory >= size;

     uint32_t strategy = createInfo.flags & VMA_ALLOCATION_CREATE_STRATEGY_MASK;

 

     // If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.

@@ -11689,7 +11909,7 @@
                     pAllocation);

                 if(res == VK_SUCCESS)

                 {

-                    VMA_DEBUG_LOG("    Returned from last block #%u", (uint32_t)(m_Blocks.size() - 1));

+                    VMA_DEBUG_LOG("    Returned from last block #%u", pCurrBlock->GetId());

                     return VK_SUCCESS;

                 }

             }

@@ -11715,7 +11935,7 @@
                         pAllocation);

                     if(res == VK_SUCCESS)

                     {

-                        VMA_DEBUG_LOG("    Returned from existing block #%u", (uint32_t)blockIndex);

+                        VMA_DEBUG_LOG("    Returned from existing block #%u", pCurrBlock->GetId());

                         return VK_SUCCESS;

                     }

                 }

@@ -11739,7 +11959,7 @@
                         pAllocation);

                     if(res == VK_SUCCESS)

                     {

-                        VMA_DEBUG_LOG("    Returned from existing block #%u", (uint32_t)blockIndex);

+                        VMA_DEBUG_LOG("    Returned from existing block #%u", pCurrBlock->GetId());

                         return VK_SUCCESS;

                     }

                 }

@@ -11774,7 +11994,8 @@
             }

 

             size_t newBlockIndex = 0;

-            VkResult res = CreateBlock(newBlockSize, &newBlockIndex);

+            VkResult res = newBlockSize <= freeMemory ?

+                CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;

             // Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.

             if(!m_ExplicitBlockSize)

             {

@@ -11785,7 +12006,8 @@
                     {

                         newBlockSize = smallerNewBlockSize;

                         ++newBlockSizeShift;

-                        res = CreateBlock(newBlockSize, &newBlockIndex);

+                        res = newBlockSize <= freeMemory ?

+                            CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;

                     }

                     else

                     {

@@ -11811,7 +12033,7 @@
                     pAllocation);

                 if(res == VK_SUCCESS)

                 {

-                    VMA_DEBUG_LOG("    Created new block Size=%llu", newBlockSize);

+                    VMA_DEBUG_LOG("    Created new block #%u Size=%llu", pBlock->GetId(), newBlockSize);

                     return VK_SUCCESS;

                 }

                 else

@@ -11945,6 +12167,8 @@
                     VMA_HEAVY_ASSERT(pBestRequestBlock->Validate());

                     VMA_DEBUG_LOG("    Returned from existing block");

                     (*pAllocation)->SetUserData(m_hAllocator, createInfo.pUserData);

+                    m_hAllocator->m_Budget.m_AllocationBytes[m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex)] += size;

+                    ++m_hAllocator->m_Budget.m_OperationsSinceBudgetFetch;

                     if(VMA_DEBUG_INITIALIZE_ALLOCATIONS)

                     {

                         m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);

@@ -11977,10 +12201,18 @@
 }

 

 void VmaBlockVector::Free(

-    VmaAllocation hAllocation)

+    const VmaAllocation hAllocation)

 {

     VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;

 

+    bool budgetExceeded = false;

+    {

+        const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);

+        VmaBudget heapBudget = {};

+        m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);

+        budgetExceeded = heapBudget.usage >= heapBudget.budget;

+    }

+

     // Scope for lock.

     {

         VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);

@@ -12003,11 +12235,12 @@
 

         VMA_DEBUG_LOG("  Freed from MemoryTypeIndex=%u", m_MemoryTypeIndex);

 

+        const bool canDeleteBlock = m_Blocks.size() > m_MinBlockCount;

         // pBlock became empty after this deallocation.

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

         {

-            // Already has empty Allocation. We don't want to have two, so delete this one.

-            if(m_HasEmptyBlock && m_Blocks.size() > m_MinBlockCount)

+            // Already has empty block. We don't want to have two, so delete this one.

+            if((m_HasEmptyBlock || budgetExceeded) && canDeleteBlock)

             {

                 pBlockToDelete = pBlock;

                 Remove(pBlock);

@@ -12020,10 +12253,10 @@
         }

         // pBlock didn't become empty, but we have another empty block - find and free that one.

         // (This is optional, heuristics.)

-        else if(m_HasEmptyBlock)

+        else if(m_HasEmptyBlock && canDeleteBlock)

         {

             VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();

-            if(pLastBlock->m_pMetadata->IsEmpty() && m_Blocks.size() > m_MinBlockCount)

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

             {

                 pBlockToDelete = pLastBlock;

                 m_Blocks.pop_back();

@@ -12034,11 +12267,11 @@
         IncrementallySortBlocks();

     }

 

-    // Destruction of a free Allocation. Deferred until this point, outside of mutex

+    // Destruction of a free block. Deferred until this point, outside of mutex

     // lock, for performance reason.

     if(pBlockToDelete != VMA_NULL)

     {

-        VMA_DEBUG_LOG("    Deleted empty allocation");

+        VMA_DEBUG_LOG("    Deleted empty block");

         pBlockToDelete->Destroy(m_hAllocator);

         vma_delete(m_hAllocator, pBlockToDelete);

     }

@@ -12147,6 +12380,8 @@
             (allocFlags & VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT) != 0);

         VMA_HEAVY_ASSERT(pBlock->Validate());

         (*pAllocation)->SetUserData(m_hAllocator, pUserData);

+        m_hAllocator->m_Budget.m_AllocationBytes[m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex)] += size;

+        ++m_hAllocator->m_Budget.m_OperationsSinceBudgetFetch;

         if(VMA_DEBUG_INITIALIZE_ALLOCATIONS)

         {

             m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);

@@ -14230,11 +14465,14 @@
     m_UseMutex((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT) == 0),

     m_UseKhrDedicatedAllocation((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0),

     m_UseKhrBindMemory2((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0),

+    m_UseExtMemoryBudget((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0),

     m_hDevice(pCreateInfo->device),

+    m_hInstance(pCreateInfo->instance),

     m_AllocationCallbacksSpecified(pCreateInfo->pAllocationCallbacks != VMA_NULL),

     m_AllocationCallbacks(pCreateInfo->pAllocationCallbacks ?

         *pCreateInfo->pAllocationCallbacks : VmaEmptyAllocationCallbacks),

     m_AllocationObjectAllocator(&m_AllocationCallbacks),

+    m_HeapSizeLimitMask(0),

     m_PreferredLargeHeapBlockSize(0),

     m_PhysicalDevice(pCreateInfo->physicalDevice),

     m_CurrentFrameIndex(0),

@@ -14265,6 +14503,12 @@
         VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.");

     }

 #endif

+#if !(VMA_MEMORY_BUDGET)

+    if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0)

+    {

+        VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.");

+    }

+#endif

 

     memset(&m_DeviceMemoryCallbacks, 0 ,sizeof(m_DeviceMemoryCallbacks));

     memset(&m_PhysicalDeviceProperties, 0, sizeof(m_PhysicalDeviceProperties));

@@ -14274,11 +14518,6 @@
     memset(&m_pDedicatedAllocations, 0, sizeof(m_pDedicatedAllocations));

     memset(&m_VulkanFunctions, 0, sizeof(m_VulkanFunctions));

 

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

-    {

-        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;

-    }

-

     if(pCreateInfo->pDeviceMemoryCallbacks != VMA_NULL)

     {

         m_DeviceMemoryCallbacks.pfnAllocate = pCreateInfo->pDeviceMemoryCallbacks->pfnAllocate;

@@ -14305,7 +14544,7 @@
             const VkDeviceSize limit = pCreateInfo->pHeapSizeLimit[heapIndex];

             if(limit != VK_WHOLE_SIZE)

             {

-                m_HeapSizeLimit[heapIndex] = limit;

+                m_HeapSizeLimitMask |= 1u << heapIndex;

                 if(limit < m_MemProps.memoryHeaps[heapIndex].size)

                 {

                     m_MemProps.memoryHeaps[heapIndex].size = limit;

@@ -14362,6 +14601,13 @@
 #endif

     }

 

+#if VMA_MEMORY_BUDGET

+    if(m_UseExtMemoryBudget)

+    {

+        UpdateVulkanBudget();

+    }

+#endif // #if VMA_MEMORY_BUDGET

+

     return res;

 }

 

@@ -14427,6 +14673,14 @@
             (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, "vkBindImageMemory2KHR");

     }

 #endif // #if VMA_BIND_MEMORY2

+#if VMA_MEMORY_BUDGET

+    if(m_UseExtMemoryBudget)

+    {

+        VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);

+        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =

+            (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, "vkGetPhysicalDeviceMemoryProperties2KHR");

+    }

+#endif // #if VMA_MEMORY_BUDGET

 #endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1

 

 #define VMA_COPY_IF_NOT_NULL(funcName) \

@@ -14459,6 +14713,9 @@
         VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);

         VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);

 #endif

+#if VMA_MEMORY_BUDGET

+        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);

+#endif

     }

 

 #undef VMA_COPY_IF_NOT_NULL

@@ -14496,6 +14753,12 @@
         VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);

     }

 #endif

+#if VMA_MEMORY_BUDGET

+    if(m_UseExtMemoryBudget)

+    {

+        VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);

+    }

+#endif

 }

 

 VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)

@@ -14503,7 +14766,7 @@
     const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);

     const VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;

     const bool isSmallHeap = heapSize <= VMA_SMALL_HEAP_MAX_SIZE;

-    return isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;

+    return VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);

 }

 

 VkResult VmaAllocator_T::AllocateMemoryOfType(

@@ -14559,6 +14822,7 @@
                 size,

                 suballocType,

                 memTypeIndex,

+                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0,

                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,

                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,

                 finalCreateInfo.pUserData,

@@ -14594,6 +14858,7 @@
                 size,

                 suballocType,

                 memTypeIndex,

+                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0,

                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,

                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,

                 finalCreateInfo.pUserData,

@@ -14621,6 +14886,7 @@
     VkDeviceSize size,

     VmaSuballocationType suballocType,

     uint32_t memTypeIndex,

+    bool withinBudget,

     bool map,

     bool isUserDataString,

     void* pUserData,

@@ -14631,6 +14897,17 @@
 {

     VMA_ASSERT(allocationCount > 0 && pAllocations);

 

+    if(withinBudget)

+    {

+        const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);

+        VmaBudget heapBudget = {};

+        GetBudget(&heapBudget, heapIndex, 1);

+        if(heapBudget.usage + size * allocationCount > heapBudget.budget)

+        {

+            return VK_ERROR_OUT_OF_DEVICE_MEMORY;

+        }

+    }

+

     VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };

     allocInfo.memoryTypeIndex = memTypeIndex;

     allocInfo.allocationSize = size;

@@ -14706,7 +14983,9 @@
             */

     

             FreeVulkanMemory(memTypeIndex, currAlloc->GetSize(), hMemory);

-

+            const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);

+            m_Budget.m_AllocationBytes[heapIndex] -= currAlloc->GetSize();

+            ++m_Budget.m_OperationsSinceBudgetFetch;

             currAlloc->SetUserData(this, VMA_NULL);

             currAlloc->Dtor();

             m_AllocationObjectAllocator.Free(currAlloc);

@@ -14758,6 +15037,9 @@
     (*pAllocation)->Ctor(m_CurrentFrameIndex.load(), isUserDataString);

     (*pAllocation)->InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);

     (*pAllocation)->SetUserData(this, pUserData);

+    const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);

+    m_Budget.m_AllocationBytes[heapIndex] += size;

+    ++m_Budget.m_OperationsSinceBudgetFetch;

     if(VMA_DEBUG_INITIALIZE_ALLOCATIONS)

     {

         FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);

@@ -15025,6 +15307,11 @@
                 }

             }

 

+            if(allocation->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)

+            {

+                m_Budget.m_AllocationBytes[MemoryTypeIndexToHeapIndex(allocation->GetMemoryTypeIndex())] -= allocation->GetSize();

+                ++m_Budget.m_OperationsSinceBudgetFetch;

+            }

             allocation->SetUserData(this, VMA_NULL);

             allocation->Dtor();

             m_AllocationObjectAllocator.Free(allocation);

@@ -15099,6 +15386,58 @@
         VmaPostprocessCalcStatInfo(pStats->memoryHeap[i]);

 }

 

+void VmaAllocator_T::GetBudget(VmaBudget* outBudget, uint32_t firstHeap, uint32_t heapCount)

+{

+#if VMA_MEMORY_BUDGET

+    if(m_UseExtMemoryBudget)

+    {

+        if(m_Budget.m_OperationsSinceBudgetFetch < 30)

+        {

+            VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);

+            for(uint32_t i = 0; i < heapCount; ++i, ++outBudget)

+            {

+                const uint32_t heapIndex = firstHeap + i;

+

+                outBudget->blockBytes = m_Budget.m_BlockBytes[heapIndex];

+                outBudget->allocationBytes = m_Budget.m_AllocationBytes[heapIndex];

+

+                if(m_Budget.m_VulkanUsage[heapIndex] + outBudget->blockBytes > m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])

+                {

+                    outBudget->usage = m_Budget.m_VulkanUsage[heapIndex] +

+                        outBudget->blockBytes - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];

+                }

+                else

+                {

+                    outBudget->usage = 0;

+                }

+

+                // Have to take MIN with heap size because explicit HeapSizeLimit is included in it.

+                outBudget->budget = VMA_MIN(

+                    m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);

+            }

+        }

+        else

+        {

+            UpdateVulkanBudget(); // Outside of mutex lock

+            GetBudget(outBudget, firstHeap, heapCount); // Recursion

+        }

+    }

+    else

+#endif

+    {

+        for(uint32_t i = 0; i < heapCount; ++i, ++outBudget)

+        {

+            const uint32_t heapIndex = firstHeap + i;

+

+            outBudget->blockBytes = m_Budget.m_BlockBytes[heapIndex];

+            outBudget->allocationBytes = m_Budget.m_AllocationBytes[heapIndex];

+

+            outBudget->usage = outBudget->blockBytes;

+            outBudget->budget = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; // 80% heuristics.

+        }

+    }

+}

+

 static const uint32_t VMA_VENDOR_ID_AMD = 4098;

 

 VkResult VmaAllocator_T::DefragmentationBegin(

@@ -15320,6 +15659,13 @@
 void VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)

 {

     m_CurrentFrameIndex.store(frameIndex);

+

+#if VMA_MEMORY_BUDGET

+    if(m_UseExtMemoryBudget)

+    {

+        UpdateVulkanBudget();

+    }

+#endif // #if VMA_MEMORY_BUDGET

 }

 

 void VmaAllocator_T::MakePoolAllocationsLost(

@@ -15397,31 +15743,45 @@
 {

     const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo->memoryTypeIndex);

 

-    VkResult res;

-    if(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)

+    // HeapSizeLimit is in effect for this heap.

+    if((m_HeapSizeLimitMask | (1u << heapIndex)) != 0)

     {

-        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);

-        if(m_HeapSizeLimit[heapIndex] >= pAllocateInfo->allocationSize)

+        const VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;

+        VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];

+        for(;;)

         {

-            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);

-            if(res == VK_SUCCESS)

+            const VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo->allocationSize;

+            if(blockBytesAfterAllocation > heapSize)

             {

-                m_HeapSizeLimit[heapIndex] -= pAllocateInfo->allocationSize;

+                return VK_ERROR_OUT_OF_DEVICE_MEMORY;

             }

-        }

-        else

-        {

-            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;

+            if(m_Budget.m_BlockBytes->compare_exchange_strong(blockBytes, blockBytesAfterAllocation))

+            {

+                break;

+            }

         }

     }

     else

     {

-        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);

+        m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo->allocationSize;

     }

 

-    if(res == VK_SUCCESS && m_DeviceMemoryCallbacks.pfnAllocate != VMA_NULL)

+    // VULKAN CALL vkAllocateMemory.

+    VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);

+

+    if(res == VK_SUCCESS)

     {

-        (*m_DeviceMemoryCallbacks.pfnAllocate)(this, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize);

+        ++m_Budget.m_OperationsSinceBudgetFetch;

+

+        // Informative callback.

+        if(m_DeviceMemoryCallbacks.pfnAllocate != VMA_NULL)

+        {

+            (*m_DeviceMemoryCallbacks.pfnAllocate)(this, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize);

+        }

+    }

+    else

+    {

+        m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo->allocationSize;

     }

 

     return res;

@@ -15429,19 +15789,18 @@
 

 void VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)

 {

+    // Informative callback.

     if(m_DeviceMemoryCallbacks.pfnFree != VMA_NULL)

     {

         (*m_DeviceMemoryCallbacks.pfnFree)(this, memoryType, hMemory, size);

     }

 

+    // VULKAN CALL vkFreeMemory.

     (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());

 

     const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);

-    if(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)

-    {

-        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);

-        m_HeapSizeLimit[heapIndex] += size;

-    }

+    m_Budget.m_BlockBytes[heapIndex] -= size;

+    ++m_Budget.m_OperationsSinceBudgetFetch;

 }

 

 VkResult VmaAllocator_T::BindVulkanBuffer(

@@ -15678,7 +16037,7 @@
     // else: Just ignore this call.

 }

 

-void VmaAllocator_T::FreeDedicatedMemory(VmaAllocation allocation)

+void VmaAllocator_T::FreeDedicatedMemory(const VmaAllocation allocation)

 {

     VMA_ASSERT(allocation && allocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);

 

@@ -15733,6 +16092,34 @@
     return memoryTypeBits;

 }

 

+#if VMA_MEMORY_BUDGET

+

+void VmaAllocator_T::UpdateVulkanBudget()

+{

+    VMA_ASSERT(m_UseExtMemoryBudget);

+

+    VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };

+

+    VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };

+    memProps.pNext = &budgetProps;

+

+    GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &memProps);

+

+    {

+        VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);

+

+        for(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)

+        {

+            m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];

+            m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];

+            m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();

+        }

+        m_Budget.m_OperationsSinceBudgetFetch = 0;

+    }

+}

+

+#endif // #if VMA_MEMORY_BUDGET

+

 void VmaAllocator_T::FillAllocation(const VmaAllocation hAllocation, uint8_t pattern)

 {

     if(VMA_DEBUG_INITIALIZE_ALLOCATIONS &&

@@ -15926,6 +16313,15 @@
     allocator->CalculateStats(pStats);

 }

 

+VMA_CALL_PRE void VMA_CALL_POST vmaGetBudget(

+    VmaAllocator allocator,

+    VmaBudget* pBudget)

+{

+    VMA_ASSERT(allocator && pBudget);

+    VMA_DEBUG_GLOBAL_MUTEX_LOCK

+    allocator->GetBudget(pBudget, 0, allocator->GetMemoryHeapCount());

+}

+

 #if VMA_STATS_STRING_ENABLED

 

 VMA_CALL_PRE void VMA_CALL_POST vmaBuildStatsString(

@@ -15941,6 +16337,9 @@
         VmaJsonWriter json(allocator->GetAllocationCallbacks(), sb);

         json.BeginObject();

 

+        VmaBudget budget[VK_MAX_MEMORY_HEAPS];

+        allocator->GetBudget(budget, 0, allocator->GetMemoryHeapCount());

+

         VmaStats stats;

         allocator->CalculateStats(&stats);

 

@@ -15965,6 +16364,20 @@
             }

             json.EndArray();

 

+            json.WriteString("Budget");

+            json.BeginObject();

+            {

+                json.WriteString("BlockBytes");

+                json.WriteNumber(budget[heapIndex].blockBytes);

+                json.WriteString("AllocationBytes");

+                json.WriteNumber(budget[heapIndex].allocationBytes);

+                json.WriteString("Usage");

+                json.WriteNumber(budget[heapIndex].usage);

+                json.WriteString("Budget");

+                json.WriteNumber(budget[heapIndex].budget);

+            }

+            json.EndObject();

+

             if(stats.memoryHeap[heapIndex].blockCount > 0)

             {

                 json.WriteString("Stats");