Publish version 2.3.0 final
Updated version number. Regenerated Release binaries and Doxygen documentation.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7d69f97..87ad08d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-# 2.3.0-alpha.1 (2019-11-25)
+# 2.3.0 (2019-12-04)
Major release after a year of development in "master" branch and feature branches. Notable new features: supporting Vulkan 1.1, supporting query for memory budget.
diff --git a/bin/VmaReplay_Release_vs2019.exe b/bin/VmaReplay_Release_vs2019.exe
index afb2137..59552c5 100644
--- a/bin/VmaReplay_Release_vs2019.exe
+++ b/bin/VmaReplay_Release_vs2019.exe
Binary files differ
diff --git a/bin/VulkanSample_Release_vs2019.exe b/bin/VulkanSample_Release_vs2019.exe
index 31fe0d3..4940505 100644
--- a/bin/VulkanSample_Release_vs2019.exe
+++ b/bin/VulkanSample_Release_vs2019.exe
Binary files differ
diff --git a/docs/html/index.html b/docs/html/index.html
index 0ff700a..bbfb810 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -65,7 +65,7 @@
<div class="title">Vulkan Memory Allocator </div> </div>
</div><!--header-->
<div class="contents">
-<div class="textblock"><p><b>Version 2.3.0-alpha.1</b> (2019-11-25)</p>
+<div class="textblock"><p><b>Version 2.3.0</b> (2019-12-04)</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>
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html
index 4c50d1c..ec5240e 100644
--- a/docs/html/vk__mem__alloc_8h_source.html
+++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -3455,7 +3455,7 @@
<div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>  </div>
<div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>  <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div>
<div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>  </div>
-<div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>  <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="l06281"></a><span class="lineno"> 6281</span>  <span class="keywordtype">bool</span> IsEmpty();</div>
<div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>  <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div>
<div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>  </div>
<div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>  VkResult Allocate(</div>
@@ -8994,5927 +8994,5933 @@
<div class="line"><a name="l11827"></a><span class="lineno">11827</span>  }</div>
<div class="line"><a name="l11828"></a><span class="lineno">11828</span> }</div>
<div class="line"><a name="l11829"></a><span class="lineno">11829</span>  </div>
-<div class="line"><a name="l11830"></a><span class="lineno">11830</span> <span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div>
-<div class="line"><a name="l11831"></a><span class="lineno">11831</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l11832"></a><span class="lineno">11832</span>  <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="l11833"></a><span class="lineno">11833</span>  <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &&</div>
-<div class="line"><a name="l11834"></a><span class="lineno">11834</span>  (VMA_DEBUG_MARGIN > 0) &&</div>
-<div class="line"><a name="l11835"></a><span class="lineno">11835</span>  (m_Algorithm == 0 || 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="l11836"></a><span class="lineno">11836</span>  (m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags;</div>
-<div class="line"><a name="l11837"></a><span class="lineno">11837</span> }</div>
-<div class="line"><a name="l11838"></a><span class="lineno">11838</span>  </div>
-<div class="line"><a name="l11839"></a><span class="lineno">11839</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div>
-<div class="line"><a name="l11840"></a><span class="lineno">11840</span>  </div>
-<div class="line"><a name="l11841"></a><span class="lineno">11841</span> VkResult VmaBlockVector::Allocate(</div>
-<div class="line"><a name="l11842"></a><span class="lineno">11842</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l11843"></a><span class="lineno">11843</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l11844"></a><span class="lineno">11844</span>  VkDeviceSize alignment,</div>
-<div class="line"><a name="l11845"></a><span class="lineno">11845</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l11846"></a><span class="lineno">11846</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l11847"></a><span class="lineno">11847</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l11848"></a><span class="lineno">11848</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l11849"></a><span class="lineno">11849</span> {</div>
-<div class="line"><a name="l11850"></a><span class="lineno">11850</span>  <span class="keywordtype">size_t</span> allocIndex;</div>
-<div class="line"><a name="l11851"></a><span class="lineno">11851</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l11852"></a><span class="lineno">11852</span>  </div>
-<div class="line"><a name="l11853"></a><span class="lineno">11853</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l11854"></a><span class="lineno">11854</span>  {</div>
-<div class="line"><a name="l11855"></a><span class="lineno">11855</span>  size = VmaAlignUp<VkDeviceSize>(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
-<div class="line"><a name="l11856"></a><span class="lineno">11856</span>  alignment = VmaAlignUp<VkDeviceSize>(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
-<div class="line"><a name="l11857"></a><span class="lineno">11857</span>  }</div>
+<div class="line"><a name="l11830"></a><span class="lineno">11830</span> <span class="keywordtype">bool</span> VmaBlockVector::IsEmpty()</div>
+<div class="line"><a name="l11831"></a><span class="lineno">11831</span> {</div>
+<div class="line"><a name="l11832"></a><span class="lineno">11832</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l11833"></a><span class="lineno">11833</span>  <span class="keywordflow">return</span> m_Blocks.empty();</div>
+<div class="line"><a name="l11834"></a><span class="lineno">11834</span> }</div>
+<div class="line"><a name="l11835"></a><span class="lineno">11835</span>  </div>
+<div class="line"><a name="l11836"></a><span class="lineno">11836</span> <span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div>
+<div class="line"><a name="l11837"></a><span class="lineno">11837</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l11838"></a><span class="lineno">11838</span>  <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="l11839"></a><span class="lineno">11839</span>  <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &&</div>
+<div class="line"><a name="l11840"></a><span class="lineno">11840</span>  (VMA_DEBUG_MARGIN > 0) &&</div>
+<div class="line"><a name="l11841"></a><span class="lineno">11841</span>  (m_Algorithm == 0 || 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="l11842"></a><span class="lineno">11842</span>  (m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags;</div>
+<div class="line"><a name="l11843"></a><span class="lineno">11843</span> }</div>
+<div class="line"><a name="l11844"></a><span class="lineno">11844</span>  </div>
+<div class="line"><a name="l11845"></a><span class="lineno">11845</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div>
+<div class="line"><a name="l11846"></a><span class="lineno">11846</span>  </div>
+<div class="line"><a name="l11847"></a><span class="lineno">11847</span> VkResult VmaBlockVector::Allocate(</div>
+<div class="line"><a name="l11848"></a><span class="lineno">11848</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11849"></a><span class="lineno">11849</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l11850"></a><span class="lineno">11850</span>  VkDeviceSize alignment,</div>
+<div class="line"><a name="l11851"></a><span class="lineno">11851</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l11852"></a><span class="lineno">11852</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l11853"></a><span class="lineno">11853</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l11854"></a><span class="lineno">11854</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l11855"></a><span class="lineno">11855</span> {</div>
+<div class="line"><a name="l11856"></a><span class="lineno">11856</span>  <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l11857"></a><span class="lineno">11857</span>  VkResult res = VK_SUCCESS;</div>
<div class="line"><a name="l11858"></a><span class="lineno">11858</span>  </div>
-<div class="line"><a name="l11859"></a><span class="lineno">11859</span>  {</div>
-<div class="line"><a name="l11860"></a><span class="lineno">11860</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l11861"></a><span class="lineno">11861</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l11862"></a><span class="lineno">11862</span>  {</div>
-<div class="line"><a name="l11863"></a><span class="lineno">11863</span>  res = AllocatePage(</div>
-<div class="line"><a name="l11864"></a><span class="lineno">11864</span>  currentFrameIndex,</div>
-<div class="line"><a name="l11865"></a><span class="lineno">11865</span>  size,</div>
-<div class="line"><a name="l11866"></a><span class="lineno">11866</span>  alignment,</div>
-<div class="line"><a name="l11867"></a><span class="lineno">11867</span>  createInfo,</div>
-<div class="line"><a name="l11868"></a><span class="lineno">11868</span>  suballocType,</div>
-<div class="line"><a name="l11869"></a><span class="lineno">11869</span>  pAllocations + allocIndex);</div>
-<div class="line"><a name="l11870"></a><span class="lineno">11870</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l11871"></a><span class="lineno">11871</span>  {</div>
-<div class="line"><a name="l11872"></a><span class="lineno">11872</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11873"></a><span class="lineno">11873</span>  }</div>
-<div class="line"><a name="l11874"></a><span class="lineno">11874</span>  }</div>
-<div class="line"><a name="l11875"></a><span class="lineno">11875</span>  }</div>
-<div class="line"><a name="l11876"></a><span class="lineno">11876</span>  </div>
-<div class="line"><a name="l11877"></a><span class="lineno">11877</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l11878"></a><span class="lineno">11878</span>  {</div>
-<div class="line"><a name="l11879"></a><span class="lineno">11879</span>  <span class="comment">// Free all already created allocations.</span></div>
-<div class="line"><a name="l11880"></a><span class="lineno">11880</span>  <span class="keywordflow">while</span>(allocIndex--)</div>
-<div class="line"><a name="l11881"></a><span class="lineno">11881</span>  {</div>
-<div class="line"><a name="l11882"></a><span class="lineno">11882</span>  Free(pAllocations[allocIndex]);</div>
-<div class="line"><a name="l11883"></a><span class="lineno">11883</span>  }</div>
-<div class="line"><a name="l11884"></a><span class="lineno">11884</span>  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="l11885"></a><span class="lineno">11885</span>  }</div>
-<div class="line"><a name="l11886"></a><span class="lineno">11886</span>  </div>
-<div class="line"><a name="l11887"></a><span class="lineno">11887</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l11888"></a><span class="lineno">11888</span> }</div>
-<div class="line"><a name="l11889"></a><span class="lineno">11889</span>  </div>
-<div class="line"><a name="l11890"></a><span class="lineno">11890</span> VkResult VmaBlockVector::AllocatePage(</div>
-<div class="line"><a name="l11891"></a><span class="lineno">11891</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l11892"></a><span class="lineno">11892</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l11893"></a><span class="lineno">11893</span>  VkDeviceSize alignment,</div>
-<div class="line"><a name="l11894"></a><span class="lineno">11894</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l11895"></a><span class="lineno">11895</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l11896"></a><span class="lineno">11896</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l11897"></a><span class="lineno">11897</span> {</div>
-<div class="line"><a name="l11898"></a><span class="lineno">11898</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
-<div class="line"><a name="l11899"></a><span class="lineno">11899</span>  <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <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="l11900"></a><span class="lineno">11900</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
-<div class="line"><a name="l11901"></a><span class="lineno">11901</span>  <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> & <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="l11902"></a><span class="lineno">11902</span>  </div>
-<div class="line"><a name="l11903"></a><span class="lineno">11903</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0;</div>
-<div class="line"><a name="l11904"></a><span class="lineno">11904</span>  VkDeviceSize freeMemory;</div>
-<div class="line"><a name="l11905"></a><span class="lineno">11905</span>  {</div>
-<div class="line"><a name="l11906"></a><span class="lineno">11906</span>  <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l11907"></a><span class="lineno">11907</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l11908"></a><span class="lineno">11908</span>  m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l11909"></a><span class="lineno">11909</span>  freeMemory = (heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> < 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="l11910"></a><span class="lineno">11910</span>  }</div>
-<div class="line"><a name="l11911"></a><span class="lineno">11911</span>  </div>
-<div class="line"><a name="l11912"></a><span class="lineno">11912</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canFallbackToDedicated = !IsCustomPool();</div>
-<div class="line"><a name="l11913"></a><span class="lineno">11913</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div>
-<div class="line"><a name="l11914"></a><span class="lineno">11914</span>  ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &&</div>
-<div class="line"><a name="l11915"></a><span class="lineno">11915</span>  (m_Blocks.size() < m_MaxBlockCount) &&</div>
-<div class="line"><a name="l11916"></a><span class="lineno">11916</span>  (freeMemory >= size || !canFallbackToDedicated);</div>
-<div class="line"><a name="l11917"></a><span class="lineno">11917</span>  uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div>
-<div class="line"><a name="l11918"></a><span class="lineno">11918</span>  </div>
-<div class="line"><a name="l11919"></a><span class="lineno">11919</span>  <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div>
-<div class="line"><a name="l11920"></a><span class="lineno">11920</span>  <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div>
-<div class="line"><a name="l11921"></a><span class="lineno">11921</span>  <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> && m_MaxBlockCount > 1)</div>
-<div class="line"><a name="l11922"></a><span class="lineno">11922</span>  {</div>
-<div class="line"><a name="l11923"></a><span class="lineno">11923</span>  canMakeOtherLost = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11924"></a><span class="lineno">11924</span>  }</div>
-<div class="line"><a name="l11925"></a><span class="lineno">11925</span>  </div>
-<div class="line"><a name="l11926"></a><span class="lineno">11926</span>  <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div>
-<div class="line"><a name="l11927"></a><span class="lineno">11927</span>  <span class="keywordflow">if</span>(isUpperAddress &&</div>
-<div class="line"><a name="l11928"></a><span class="lineno">11928</span>  (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount > 1))</div>
-<div class="line"><a name="l11929"></a><span class="lineno">11929</span>  {</div>
-<div class="line"><a name="l11930"></a><span class="lineno">11930</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l11931"></a><span class="lineno">11931</span>  }</div>
-<div class="line"><a name="l11932"></a><span class="lineno">11932</span>  </div>
-<div class="line"><a name="l11933"></a><span class="lineno">11933</span>  <span class="comment">// Validate strategy.</span></div>
-<div class="line"><a name="l11934"></a><span class="lineno">11934</span>  <span class="keywordflow">switch</span>(strategy)</div>
+<div class="line"><a name="l11859"></a><span class="lineno">11859</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l11860"></a><span class="lineno">11860</span>  {</div>
+<div class="line"><a name="l11861"></a><span class="lineno">11861</span>  size = VmaAlignUp<VkDeviceSize>(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
+<div class="line"><a name="l11862"></a><span class="lineno">11862</span>  alignment = VmaAlignUp<VkDeviceSize>(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
+<div class="line"><a name="l11863"></a><span class="lineno">11863</span>  }</div>
+<div class="line"><a name="l11864"></a><span class="lineno">11864</span>  </div>
+<div class="line"><a name="l11865"></a><span class="lineno">11865</span>  {</div>
+<div class="line"><a name="l11866"></a><span class="lineno">11866</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l11867"></a><span class="lineno">11867</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l11868"></a><span class="lineno">11868</span>  {</div>
+<div class="line"><a name="l11869"></a><span class="lineno">11869</span>  res = AllocatePage(</div>
+<div class="line"><a name="l11870"></a><span class="lineno">11870</span>  currentFrameIndex,</div>
+<div class="line"><a name="l11871"></a><span class="lineno">11871</span>  size,</div>
+<div class="line"><a name="l11872"></a><span class="lineno">11872</span>  alignment,</div>
+<div class="line"><a name="l11873"></a><span class="lineno">11873</span>  createInfo,</div>
+<div class="line"><a name="l11874"></a><span class="lineno">11874</span>  suballocType,</div>
+<div class="line"><a name="l11875"></a><span class="lineno">11875</span>  pAllocations + allocIndex);</div>
+<div class="line"><a name="l11876"></a><span class="lineno">11876</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l11877"></a><span class="lineno">11877</span>  {</div>
+<div class="line"><a name="l11878"></a><span class="lineno">11878</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11879"></a><span class="lineno">11879</span>  }</div>
+<div class="line"><a name="l11880"></a><span class="lineno">11880</span>  }</div>
+<div class="line"><a name="l11881"></a><span class="lineno">11881</span>  }</div>
+<div class="line"><a name="l11882"></a><span class="lineno">11882</span>  </div>
+<div class="line"><a name="l11883"></a><span class="lineno">11883</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l11884"></a><span class="lineno">11884</span>  {</div>
+<div class="line"><a name="l11885"></a><span class="lineno">11885</span>  <span class="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l11886"></a><span class="lineno">11886</span>  <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l11887"></a><span class="lineno">11887</span>  {</div>
+<div class="line"><a name="l11888"></a><span class="lineno">11888</span>  Free(pAllocations[allocIndex]);</div>
+<div class="line"><a name="l11889"></a><span class="lineno">11889</span>  }</div>
+<div class="line"><a name="l11890"></a><span class="lineno">11890</span>  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="l11891"></a><span class="lineno">11891</span>  }</div>
+<div class="line"><a name="l11892"></a><span class="lineno">11892</span>  </div>
+<div class="line"><a name="l11893"></a><span class="lineno">11893</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l11894"></a><span class="lineno">11894</span> }</div>
+<div class="line"><a name="l11895"></a><span class="lineno">11895</span>  </div>
+<div class="line"><a name="l11896"></a><span class="lineno">11896</span> VkResult VmaBlockVector::AllocatePage(</div>
+<div class="line"><a name="l11897"></a><span class="lineno">11897</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11898"></a><span class="lineno">11898</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l11899"></a><span class="lineno">11899</span>  VkDeviceSize alignment,</div>
+<div class="line"><a name="l11900"></a><span class="lineno">11900</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l11901"></a><span class="lineno">11901</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l11902"></a><span class="lineno">11902</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l11903"></a><span class="lineno">11903</span> {</div>
+<div class="line"><a name="l11904"></a><span class="lineno">11904</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
+<div class="line"><a name="l11905"></a><span class="lineno">11905</span>  <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <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="l11906"></a><span class="lineno">11906</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
+<div class="line"><a name="l11907"></a><span class="lineno">11907</span>  <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> & <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="l11908"></a><span class="lineno">11908</span>  </div>
+<div class="line"><a name="l11909"></a><span class="lineno">11909</span>  <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> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0;</div>
+<div class="line"><a name="l11910"></a><span class="lineno">11910</span>  VkDeviceSize freeMemory;</div>
+<div class="line"><a name="l11911"></a><span class="lineno">11911</span>  {</div>
+<div class="line"><a name="l11912"></a><span class="lineno">11912</span>  <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l11913"></a><span class="lineno">11913</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l11914"></a><span class="lineno">11914</span>  m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l11915"></a><span class="lineno">11915</span>  freeMemory = (heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> < 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="l11916"></a><span class="lineno">11916</span>  }</div>
+<div class="line"><a name="l11917"></a><span class="lineno">11917</span>  </div>
+<div class="line"><a name="l11918"></a><span class="lineno">11918</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canFallbackToDedicated = !IsCustomPool();</div>
+<div class="line"><a name="l11919"></a><span class="lineno">11919</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div>
+<div class="line"><a name="l11920"></a><span class="lineno">11920</span>  ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &&</div>
+<div class="line"><a name="l11921"></a><span class="lineno">11921</span>  (m_Blocks.size() < m_MaxBlockCount) &&</div>
+<div class="line"><a name="l11922"></a><span class="lineno">11922</span>  (freeMemory >= size || !canFallbackToDedicated);</div>
+<div class="line"><a name="l11923"></a><span class="lineno">11923</span>  uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div>
+<div class="line"><a name="l11924"></a><span class="lineno">11924</span>  </div>
+<div class="line"><a name="l11925"></a><span class="lineno">11925</span>  <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div>
+<div class="line"><a name="l11926"></a><span class="lineno">11926</span>  <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div>
+<div class="line"><a name="l11927"></a><span class="lineno">11927</span>  <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> && m_MaxBlockCount > 1)</div>
+<div class="line"><a name="l11928"></a><span class="lineno">11928</span>  {</div>
+<div class="line"><a name="l11929"></a><span class="lineno">11929</span>  canMakeOtherLost = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11930"></a><span class="lineno">11930</span>  }</div>
+<div class="line"><a name="l11931"></a><span class="lineno">11931</span>  </div>
+<div class="line"><a name="l11932"></a><span class="lineno">11932</span>  <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div>
+<div class="line"><a name="l11933"></a><span class="lineno">11933</span>  <span class="keywordflow">if</span>(isUpperAddress &&</div>
+<div class="line"><a name="l11934"></a><span class="lineno">11934</span>  (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount > 1))</div>
<div class="line"><a name="l11935"></a><span class="lineno">11935</span>  {</div>
-<div class="line"><a name="l11936"></a><span class="lineno">11936</span>  <span class="keywordflow">case</span> 0:</div>
-<div class="line"><a name="l11937"></a><span class="lineno">11937</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="l11938"></a><span class="lineno">11938</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11939"></a><span class="lineno">11939</span>  <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="l11940"></a><span class="lineno">11940</span>  <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="l11941"></a><span class="lineno">11941</span>  <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="l11942"></a><span class="lineno">11942</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11943"></a><span class="lineno">11943</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l11944"></a><span class="lineno">11944</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l11945"></a><span class="lineno">11945</span>  }</div>
-<div class="line"><a name="l11946"></a><span class="lineno">11946</span>  </div>
-<div class="line"><a name="l11947"></a><span class="lineno">11947</span>  <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="l11948"></a><span class="lineno">11948</span>  <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN > m_PreferredBlockSize)</div>
-<div class="line"><a name="l11949"></a><span class="lineno">11949</span>  {</div>
-<div class="line"><a name="l11950"></a><span class="lineno">11950</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l11936"></a><span class="lineno">11936</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l11937"></a><span class="lineno">11937</span>  }</div>
+<div class="line"><a name="l11938"></a><span class="lineno">11938</span>  </div>
+<div class="line"><a name="l11939"></a><span class="lineno">11939</span>  <span class="comment">// Validate strategy.</span></div>
+<div class="line"><a name="l11940"></a><span class="lineno">11940</span>  <span class="keywordflow">switch</span>(strategy)</div>
+<div class="line"><a name="l11941"></a><span class="lineno">11941</span>  {</div>
+<div class="line"><a name="l11942"></a><span class="lineno">11942</span>  <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l11943"></a><span class="lineno">11943</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="l11944"></a><span class="lineno">11944</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11945"></a><span class="lineno">11945</span>  <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="l11946"></a><span class="lineno">11946</span>  <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="l11947"></a><span class="lineno">11947</span>  <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="l11948"></a><span class="lineno">11948</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11949"></a><span class="lineno">11949</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11950"></a><span class="lineno">11950</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
<div class="line"><a name="l11951"></a><span class="lineno">11951</span>  }</div>
<div class="line"><a name="l11952"></a><span class="lineno">11952</span>  </div>
-<div class="line"><a name="l11953"></a><span class="lineno">11953</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l11954"></a><span class="lineno">11954</span> <span class="comment"> Under certain condition, this whole section can be skipped for optimization, so</span></div>
-<div class="line"><a name="l11955"></a><span class="lineno">11955</span> <span class="comment"> we move on directly to trying to allocate with canMakeOtherLost. That's the case</span></div>
-<div class="line"><a name="l11956"></a><span class="lineno">11956</span> <span class="comment"> e.g. for custom pools with linear algorithm.</span></div>
-<div class="line"><a name="l11957"></a><span class="lineno">11957</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l11958"></a><span class="lineno">11958</span>  <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div>
-<div class="line"><a name="l11959"></a><span class="lineno">11959</span>  {</div>
-<div class="line"><a name="l11960"></a><span class="lineno">11960</span>  <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div>
-<div class="line"><a name="l11961"></a><span class="lineno">11961</span>  <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="l11962"></a><span class="lineno">11962</span>  allocFlagsCopy &= ~<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="l11963"></a><span class="lineno">11963</span>  </div>
-<div class="line"><a name="l11964"></a><span class="lineno">11964</span>  <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="l11965"></a><span class="lineno">11965</span>  {</div>
-<div class="line"><a name="l11966"></a><span class="lineno">11966</span>  <span class="comment">// Use only last block.</span></div>
-<div class="line"><a name="l11967"></a><span class="lineno">11967</span>  <span class="keywordflow">if</span>(!m_Blocks.empty())</div>
-<div class="line"><a name="l11968"></a><span class="lineno">11968</span>  {</div>
-<div class="line"><a name="l11969"></a><span class="lineno">11969</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div>
-<div class="line"><a name="l11970"></a><span class="lineno">11970</span>  VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l11971"></a><span class="lineno">11971</span>  VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l11972"></a><span class="lineno">11972</span>  pCurrBlock,</div>
-<div class="line"><a name="l11973"></a><span class="lineno">11973</span>  currentFrameIndex,</div>
-<div class="line"><a name="l11974"></a><span class="lineno">11974</span>  size,</div>
-<div class="line"><a name="l11975"></a><span class="lineno">11975</span>  alignment,</div>
-<div class="line"><a name="l11976"></a><span class="lineno">11976</span>  allocFlagsCopy,</div>
-<div class="line"><a name="l11977"></a><span class="lineno">11977</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l11978"></a><span class="lineno">11978</span>  suballocType,</div>
-<div class="line"><a name="l11979"></a><span class="lineno">11979</span>  strategy,</div>
-<div class="line"><a name="l11980"></a><span class="lineno">11980</span>  pAllocation);</div>
-<div class="line"><a name="l11981"></a><span class="lineno">11981</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l11982"></a><span class="lineno">11982</span>  {</div>
-<div class="line"><a name="l11983"></a><span class="lineno">11983</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from last block #%u"</span>, pCurrBlock->GetId());</div>
-<div class="line"><a name="l11984"></a><span class="lineno">11984</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l11985"></a><span class="lineno">11985</span>  }</div>
-<div class="line"><a name="l11986"></a><span class="lineno">11986</span>  }</div>
-<div class="line"><a name="l11987"></a><span class="lineno">11987</span>  }</div>
-<div class="line"><a name="l11988"></a><span class="lineno">11988</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11989"></a><span class="lineno">11989</span>  {</div>
-<div class="line"><a name="l11990"></a><span class="lineno">11990</span>  <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="l11991"></a><span class="lineno">11991</span>  {</div>
-<div class="line"><a name="l11992"></a><span class="lineno">11992</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
-<div class="line"><a name="l11993"></a><span class="lineno">11993</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex )</div>
-<div class="line"><a name="l11994"></a><span class="lineno">11994</span>  {</div>
-<div class="line"><a name="l11995"></a><span class="lineno">11995</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l11996"></a><span class="lineno">11996</span>  VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l11997"></a><span class="lineno">11997</span>  VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l11998"></a><span class="lineno">11998</span>  pCurrBlock,</div>
-<div class="line"><a name="l11999"></a><span class="lineno">11999</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12000"></a><span class="lineno">12000</span>  size,</div>
-<div class="line"><a name="l12001"></a><span class="lineno">12001</span>  alignment,</div>
-<div class="line"><a name="l12002"></a><span class="lineno">12002</span>  allocFlagsCopy,</div>
-<div class="line"><a name="l12003"></a><span class="lineno">12003</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12004"></a><span class="lineno">12004</span>  suballocType,</div>
-<div class="line"><a name="l12005"></a><span class="lineno">12005</span>  strategy,</div>
-<div class="line"><a name="l12006"></a><span class="lineno">12006</span>  pAllocation);</div>
-<div class="line"><a name="l12007"></a><span class="lineno">12007</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12008"></a><span class="lineno">12008</span>  {</div>
-<div class="line"><a name="l12009"></a><span class="lineno">12009</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div>
-<div class="line"><a name="l12010"></a><span class="lineno">12010</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12011"></a><span class="lineno">12011</span>  }</div>
-<div class="line"><a name="l12012"></a><span class="lineno">12012</span>  }</div>
-<div class="line"><a name="l12013"></a><span class="lineno">12013</span>  }</div>
-<div class="line"><a name="l12014"></a><span class="lineno">12014</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
-<div class="line"><a name="l12015"></a><span class="lineno">12015</span>  {</div>
-<div class="line"><a name="l12016"></a><span class="lineno">12016</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
-<div class="line"><a name="l12017"></a><span class="lineno">12017</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l12018"></a><span class="lineno">12018</span>  {</div>
-<div class="line"><a name="l12019"></a><span class="lineno">12019</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12020"></a><span class="lineno">12020</span>  VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12021"></a><span class="lineno">12021</span>  VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l12022"></a><span class="lineno">12022</span>  pCurrBlock,</div>
-<div class="line"><a name="l12023"></a><span class="lineno">12023</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12024"></a><span class="lineno">12024</span>  size,</div>
-<div class="line"><a name="l12025"></a><span class="lineno">12025</span>  alignment,</div>
-<div class="line"><a name="l12026"></a><span class="lineno">12026</span>  allocFlagsCopy,</div>
-<div class="line"><a name="l12027"></a><span class="lineno">12027</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12028"></a><span class="lineno">12028</span>  suballocType,</div>
-<div class="line"><a name="l12029"></a><span class="lineno">12029</span>  strategy,</div>
-<div class="line"><a name="l12030"></a><span class="lineno">12030</span>  pAllocation);</div>
-<div class="line"><a name="l12031"></a><span class="lineno">12031</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12032"></a><span class="lineno">12032</span>  {</div>
-<div class="line"><a name="l12033"></a><span class="lineno">12033</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div>
-<div class="line"><a name="l12034"></a><span class="lineno">12034</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12035"></a><span class="lineno">12035</span>  }</div>
-<div class="line"><a name="l12036"></a><span class="lineno">12036</span>  }</div>
-<div class="line"><a name="l12037"></a><span class="lineno">12037</span>  }</div>
-<div class="line"><a name="l12038"></a><span class="lineno">12038</span>  }</div>
-<div class="line"><a name="l12039"></a><span class="lineno">12039</span>  </div>
-<div class="line"><a name="l12040"></a><span class="lineno">12040</span>  <span class="comment">// 2. Try to create new block.</span></div>
-<div class="line"><a name="l12041"></a><span class="lineno">12041</span>  <span class="keywordflow">if</span>(canCreateNewBlock)</div>
-<div class="line"><a name="l12042"></a><span class="lineno">12042</span>  {</div>
-<div class="line"><a name="l12043"></a><span class="lineno">12043</span>  <span class="comment">// Calculate optimal size for new block.</span></div>
-<div class="line"><a name="l12044"></a><span class="lineno">12044</span>  VkDeviceSize newBlockSize = m_PreferredBlockSize;</div>
-<div class="line"><a name="l12045"></a><span class="lineno">12045</span>  uint32_t newBlockSizeShift = 0;</div>
-<div class="line"><a name="l12046"></a><span class="lineno">12046</span>  <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div>
-<div class="line"><a name="l12047"></a><span class="lineno">12047</span>  </div>
-<div class="line"><a name="l12048"></a><span class="lineno">12048</span>  <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
-<div class="line"><a name="l12049"></a><span class="lineno">12049</span>  {</div>
-<div class="line"><a name="l12050"></a><span class="lineno">12050</span>  <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div>
-<div class="line"><a name="l12051"></a><span class="lineno">12051</span>  <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div>
-<div class="line"><a name="l12052"></a><span class="lineno">12052</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div>
-<div class="line"><a name="l12053"></a><span class="lineno">12053</span>  {</div>
-<div class="line"><a name="l12054"></a><span class="lineno">12054</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
-<div class="line"><a name="l12055"></a><span class="lineno">12055</span>  <span class="keywordflow">if</span>(smallerNewBlockSize > maxExistingBlockSize && smallerNewBlockSize >= size * 2)</div>
-<div class="line"><a name="l12056"></a><span class="lineno">12056</span>  {</div>
-<div class="line"><a name="l12057"></a><span class="lineno">12057</span>  newBlockSize = smallerNewBlockSize;</div>
-<div class="line"><a name="l12058"></a><span class="lineno">12058</span>  ++newBlockSizeShift;</div>
-<div class="line"><a name="l12059"></a><span class="lineno">12059</span>  }</div>
-<div class="line"><a name="l12060"></a><span class="lineno">12060</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12061"></a><span class="lineno">12061</span>  {</div>
-<div class="line"><a name="l12062"></a><span class="lineno">12062</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12063"></a><span class="lineno">12063</span>  }</div>
-<div class="line"><a name="l12064"></a><span class="lineno">12064</span>  }</div>
-<div class="line"><a name="l12065"></a><span class="lineno">12065</span>  }</div>
-<div class="line"><a name="l12066"></a><span class="lineno">12066</span>  </div>
-<div class="line"><a name="l12067"></a><span class="lineno">12067</span>  <span class="keywordtype">size_t</span> newBlockIndex = 0;</div>
-<div class="line"><a name="l12068"></a><span class="lineno">12068</span>  VkResult res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div>
-<div class="line"><a name="l12069"></a><span class="lineno">12069</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12070"></a><span class="lineno">12070</span>  <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="l12071"></a><span class="lineno">12071</span>  <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
-<div class="line"><a name="l12072"></a><span class="lineno">12072</span>  {</div>
-<div class="line"><a name="l12073"></a><span class="lineno">12073</span>  <span class="keywordflow">while</span>(res < 0 && newBlockSizeShift < NEW_BLOCK_SIZE_SHIFT_MAX)</div>
-<div class="line"><a name="l12074"></a><span class="lineno">12074</span>  {</div>
-<div class="line"><a name="l12075"></a><span class="lineno">12075</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
-<div class="line"><a name="l12076"></a><span class="lineno">12076</span>  <span class="keywordflow">if</span>(smallerNewBlockSize >= size)</div>
-<div class="line"><a name="l12077"></a><span class="lineno">12077</span>  {</div>
-<div class="line"><a name="l12078"></a><span class="lineno">12078</span>  newBlockSize = smallerNewBlockSize;</div>
-<div class="line"><a name="l12079"></a><span class="lineno">12079</span>  ++newBlockSizeShift;</div>
-<div class="line"><a name="l12080"></a><span class="lineno">12080</span>  res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div>
-<div class="line"><a name="l12081"></a><span class="lineno">12081</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12082"></a><span class="lineno">12082</span>  }</div>
-<div class="line"><a name="l12083"></a><span class="lineno">12083</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12084"></a><span class="lineno">12084</span>  {</div>
-<div class="line"><a name="l12085"></a><span class="lineno">12085</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12086"></a><span class="lineno">12086</span>  }</div>
-<div class="line"><a name="l12087"></a><span class="lineno">12087</span>  }</div>
-<div class="line"><a name="l12088"></a><span class="lineno">12088</span>  }</div>
-<div class="line"><a name="l12089"></a><span class="lineno">12089</span>  </div>
-<div class="line"><a name="l12090"></a><span class="lineno">12090</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12091"></a><span class="lineno">12091</span>  {</div>
-<div class="line"><a name="l12092"></a><span class="lineno">12092</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div>
-<div class="line"><a name="l12093"></a><span class="lineno">12093</span>  VMA_ASSERT(pBlock->m_pMetadata->GetSize() >= size);</div>
-<div class="line"><a name="l12094"></a><span class="lineno">12094</span>  </div>
-<div class="line"><a name="l12095"></a><span class="lineno">12095</span>  res = AllocateFromBlock(</div>
-<div class="line"><a name="l12096"></a><span class="lineno">12096</span>  pBlock,</div>
-<div class="line"><a name="l12097"></a><span class="lineno">12097</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12098"></a><span class="lineno">12098</span>  size,</div>
-<div class="line"><a name="l12099"></a><span class="lineno">12099</span>  alignment,</div>
-<div class="line"><a name="l12100"></a><span class="lineno">12100</span>  allocFlagsCopy,</div>
-<div class="line"><a name="l12101"></a><span class="lineno">12101</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12102"></a><span class="lineno">12102</span>  suballocType,</div>
-<div class="line"><a name="l12103"></a><span class="lineno">12103</span>  strategy,</div>
-<div class="line"><a name="l12104"></a><span class="lineno">12104</span>  pAllocation);</div>
-<div class="line"><a name="l12105"></a><span class="lineno">12105</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12106"></a><span class="lineno">12106</span>  {</div>
-<div class="line"><a name="l12107"></a><span class="lineno">12107</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Created new block #%u Size=%llu"</span>, pBlock->GetId(), newBlockSize);</div>
-<div class="line"><a name="l12108"></a><span class="lineno">12108</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12109"></a><span class="lineno">12109</span>  }</div>
-<div class="line"><a name="l12110"></a><span class="lineno">12110</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12111"></a><span class="lineno">12111</span>  {</div>
-<div class="line"><a name="l12112"></a><span class="lineno">12112</span>  <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div>
-<div class="line"><a name="l12113"></a><span class="lineno">12113</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12114"></a><span class="lineno">12114</span>  }</div>
-<div class="line"><a name="l12115"></a><span class="lineno">12115</span>  }</div>
-<div class="line"><a name="l12116"></a><span class="lineno">12116</span>  }</div>
-<div class="line"><a name="l12117"></a><span class="lineno">12117</span>  }</div>
-<div class="line"><a name="l12118"></a><span class="lineno">12118</span>  </div>
-<div class="line"><a name="l12119"></a><span class="lineno">12119</span>  <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div>
-<div class="line"><a name="l12120"></a><span class="lineno">12120</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div>
-<div class="line"><a name="l12121"></a><span class="lineno">12121</span>  {</div>
-<div class="line"><a name="l12122"></a><span class="lineno">12122</span>  uint32_t tryIndex = 0;</div>
-<div class="line"><a name="l12123"></a><span class="lineno">12123</span>  <span class="keywordflow">for</span>(; tryIndex < VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div>
-<div class="line"><a name="l12124"></a><span class="lineno">12124</span>  {</div>
-<div class="line"><a name="l12125"></a><span class="lineno">12125</span>  VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div>
-<div class="line"><a name="l12126"></a><span class="lineno">12126</span>  VmaAllocationRequest bestRequest = {};</div>
-<div class="line"><a name="l12127"></a><span class="lineno">12127</span>  VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l12128"></a><span class="lineno">12128</span>  </div>
-<div class="line"><a name="l12129"></a><span class="lineno">12129</span>  <span class="comment">// 1. Search existing allocations.</span></div>
-<div class="line"><a name="l12130"></a><span class="lineno">12130</span>  <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="l12131"></a><span class="lineno">12131</span>  {</div>
-<div class="line"><a name="l12132"></a><span class="lineno">12132</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
-<div class="line"><a name="l12133"></a><span class="lineno">12133</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex )</div>
-<div class="line"><a name="l12134"></a><span class="lineno">12134</span>  {</div>
-<div class="line"><a name="l12135"></a><span class="lineno">12135</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12136"></a><span class="lineno">12136</span>  VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12137"></a><span class="lineno">12137</span>  VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l12138"></a><span class="lineno">12138</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div>
-<div class="line"><a name="l12139"></a><span class="lineno">12139</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12140"></a><span class="lineno">12140</span>  m_FrameInUseCount,</div>
-<div class="line"><a name="l12141"></a><span class="lineno">12141</span>  m_BufferImageGranularity,</div>
-<div class="line"><a name="l12142"></a><span class="lineno">12142</span>  size,</div>
-<div class="line"><a name="l12143"></a><span class="lineno">12143</span>  alignment,</div>
-<div class="line"><a name="l12144"></a><span class="lineno">12144</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
-<div class="line"><a name="l12145"></a><span class="lineno">12145</span>  suballocType,</div>
-<div class="line"><a name="l12146"></a><span class="lineno">12146</span>  canMakeOtherLost,</div>
-<div class="line"><a name="l12147"></a><span class="lineno">12147</span>  strategy,</div>
-<div class="line"><a name="l12148"></a><span class="lineno">12148</span>  &currRequest))</div>
-<div class="line"><a name="l12149"></a><span class="lineno">12149</span>  {</div>
-<div class="line"><a name="l12150"></a><span class="lineno">12150</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
-<div class="line"><a name="l12151"></a><span class="lineno">12151</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
-<div class="line"><a name="l12152"></a><span class="lineno">12152</span>  currRequestCost < bestRequestCost)</div>
-<div class="line"><a name="l12153"></a><span class="lineno">12153</span>  {</div>
-<div class="line"><a name="l12154"></a><span class="lineno">12154</span>  pBestRequestBlock = pCurrBlock;</div>
-<div class="line"><a name="l12155"></a><span class="lineno">12155</span>  bestRequest = currRequest;</div>
-<div class="line"><a name="l12156"></a><span class="lineno">12156</span>  bestRequestCost = currRequestCost;</div>
-<div class="line"><a name="l12157"></a><span class="lineno">12157</span>  </div>
-<div class="line"><a name="l12158"></a><span class="lineno">12158</span>  <span class="keywordflow">if</span>(bestRequestCost == 0)</div>
-<div class="line"><a name="l12159"></a><span class="lineno">12159</span>  {</div>
-<div class="line"><a name="l12160"></a><span class="lineno">12160</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12161"></a><span class="lineno">12161</span>  }</div>
-<div class="line"><a name="l12162"></a><span class="lineno">12162</span>  }</div>
-<div class="line"><a name="l12163"></a><span class="lineno">12163</span>  }</div>
-<div class="line"><a name="l12164"></a><span class="lineno">12164</span>  }</div>
-<div class="line"><a name="l12165"></a><span class="lineno">12165</span>  }</div>
-<div class="line"><a name="l12166"></a><span class="lineno">12166</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
-<div class="line"><a name="l12167"></a><span class="lineno">12167</span>  {</div>
-<div class="line"><a name="l12168"></a><span class="lineno">12168</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
-<div class="line"><a name="l12169"></a><span class="lineno">12169</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l12170"></a><span class="lineno">12170</span>  {</div>
-<div class="line"><a name="l12171"></a><span class="lineno">12171</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12172"></a><span class="lineno">12172</span>  VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12173"></a><span class="lineno">12173</span>  VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l12174"></a><span class="lineno">12174</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div>
-<div class="line"><a name="l12175"></a><span class="lineno">12175</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12176"></a><span class="lineno">12176</span>  m_FrameInUseCount,</div>
-<div class="line"><a name="l12177"></a><span class="lineno">12177</span>  m_BufferImageGranularity,</div>
-<div class="line"><a name="l12178"></a><span class="lineno">12178</span>  size,</div>
-<div class="line"><a name="l12179"></a><span class="lineno">12179</span>  alignment,</div>
-<div class="line"><a name="l12180"></a><span class="lineno">12180</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
-<div class="line"><a name="l12181"></a><span class="lineno">12181</span>  suballocType,</div>
-<div class="line"><a name="l12182"></a><span class="lineno">12182</span>  canMakeOtherLost,</div>
-<div class="line"><a name="l12183"></a><span class="lineno">12183</span>  strategy,</div>
-<div class="line"><a name="l12184"></a><span class="lineno">12184</span>  &currRequest))</div>
-<div class="line"><a name="l12185"></a><span class="lineno">12185</span>  {</div>
-<div class="line"><a name="l12186"></a><span class="lineno">12186</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
-<div class="line"><a name="l12187"></a><span class="lineno">12187</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
-<div class="line"><a name="l12188"></a><span class="lineno">12188</span>  currRequestCost < bestRequestCost ||</div>
-<div class="line"><a name="l12189"></a><span class="lineno">12189</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="l12190"></a><span class="lineno">12190</span>  {</div>
-<div class="line"><a name="l12191"></a><span class="lineno">12191</span>  pBestRequestBlock = pCurrBlock;</div>
-<div class="line"><a name="l12192"></a><span class="lineno">12192</span>  bestRequest = currRequest;</div>
-<div class="line"><a name="l12193"></a><span class="lineno">12193</span>  bestRequestCost = currRequestCost;</div>
-<div class="line"><a name="l12194"></a><span class="lineno">12194</span>  </div>
-<div class="line"><a name="l12195"></a><span class="lineno">12195</span>  <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div>
-<div class="line"><a name="l12196"></a><span class="lineno">12196</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="l12197"></a><span class="lineno">12197</span>  {</div>
-<div class="line"><a name="l12198"></a><span class="lineno">12198</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12199"></a><span class="lineno">12199</span>  }</div>
-<div class="line"><a name="l12200"></a><span class="lineno">12200</span>  }</div>
-<div class="line"><a name="l12201"></a><span class="lineno">12201</span>  }</div>
-<div class="line"><a name="l12202"></a><span class="lineno">12202</span>  }</div>
-<div class="line"><a name="l12203"></a><span class="lineno">12203</span>  }</div>
-<div class="line"><a name="l12204"></a><span class="lineno">12204</span>  </div>
-<div class="line"><a name="l12205"></a><span class="lineno">12205</span>  <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div>
-<div class="line"><a name="l12206"></a><span class="lineno">12206</span>  {</div>
-<div class="line"><a name="l12207"></a><span class="lineno">12207</span>  <span class="keywordflow">if</span>(mapped)</div>
-<div class="line"><a name="l12208"></a><span class="lineno">12208</span>  {</div>
-<div class="line"><a name="l12209"></a><span class="lineno">12209</span>  VkResult res = pBestRequestBlock->Map(m_hAllocator, 1, VMA_NULL);</div>
-<div class="line"><a name="l12210"></a><span class="lineno">12210</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12211"></a><span class="lineno">12211</span>  {</div>
-<div class="line"><a name="l12212"></a><span class="lineno">12212</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12213"></a><span class="lineno">12213</span>  }</div>
-<div class="line"><a name="l12214"></a><span class="lineno">12214</span>  }</div>
-<div class="line"><a name="l12215"></a><span class="lineno">12215</span>  </div>
-<div class="line"><a name="l12216"></a><span class="lineno">12216</span>  <span class="keywordflow">if</span>(pBestRequestBlock->m_pMetadata->MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l12217"></a><span class="lineno">12217</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12218"></a><span class="lineno">12218</span>  m_FrameInUseCount,</div>
-<div class="line"><a name="l12219"></a><span class="lineno">12219</span>  &bestRequest))</div>
-<div class="line"><a name="l12220"></a><span class="lineno">12220</span>  {</div>
-<div class="line"><a name="l12221"></a><span class="lineno">12221</span>  <span class="comment">// Allocate from this pBlock.</span></div>
-<div class="line"><a name="l12222"></a><span class="lineno">12222</span>  *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate();</div>
-<div class="line"><a name="l12223"></a><span class="lineno">12223</span>  (*pAllocation)->Ctor(currentFrameIndex, isUserDataString);</div>
-<div class="line"><a name="l12224"></a><span class="lineno">12224</span>  pBestRequestBlock->m_pMetadata->Alloc(bestRequest, suballocType, size, *pAllocation);</div>
-<div class="line"><a name="l12225"></a><span class="lineno">12225</span>  UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12226"></a><span class="lineno">12226</span>  (*pAllocation)->InitBlockAllocation(</div>
-<div class="line"><a name="l12227"></a><span class="lineno">12227</span>  pBestRequestBlock,</div>
-<div class="line"><a name="l12228"></a><span class="lineno">12228</span>  bestRequest.offset,</div>
-<div class="line"><a name="l12229"></a><span class="lineno">12229</span>  alignment,</div>
-<div class="line"><a name="l12230"></a><span class="lineno">12230</span>  size,</div>
-<div class="line"><a name="l12231"></a><span class="lineno">12231</span>  m_MemoryTypeIndex,</div>
-<div class="line"><a name="l12232"></a><span class="lineno">12232</span>  suballocType,</div>
-<div class="line"><a name="l12233"></a><span class="lineno">12233</span>  mapped,</div>
-<div class="line"><a name="l12234"></a><span class="lineno">12234</span>  (createInfo.<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>) != 0);</div>
-<div class="line"><a name="l12235"></a><span class="lineno">12235</span>  VMA_HEAVY_ASSERT(pBestRequestBlock->Validate());</div>
-<div class="line"><a name="l12236"></a><span class="lineno">12236</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block"</span>);</div>
-<div class="line"><a name="l12237"></a><span class="lineno">12237</span>  (*pAllocation)->SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l12238"></a><span class="lineno">12238</span>  m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
-<div class="line"><a name="l12239"></a><span class="lineno">12239</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l12240"></a><span class="lineno">12240</span>  {</div>
-<div class="line"><a name="l12241"></a><span class="lineno">12241</span>  m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l12242"></a><span class="lineno">12242</span>  }</div>
-<div class="line"><a name="l12243"></a><span class="lineno">12243</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12244"></a><span class="lineno">12244</span>  {</div>
-<div class="line"><a name="l12245"></a><span class="lineno">12245</span>  VkResult res = pBestRequestBlock->WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div>
-<div class="line"><a name="l12246"></a><span class="lineno">12246</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to write magic value."</span>);</div>
-<div class="line"><a name="l12247"></a><span class="lineno">12247</span>  }</div>
-<div class="line"><a name="l12248"></a><span class="lineno">12248</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12249"></a><span class="lineno">12249</span>  }</div>
-<div class="line"><a name="l12250"></a><span class="lineno">12250</span>  <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div>
-<div class="line"><a name="l12251"></a><span class="lineno">12251</span>  }</div>
-<div class="line"><a name="l12252"></a><span class="lineno">12252</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12253"></a><span class="lineno">12253</span>  {</div>
-<div class="line"><a name="l12254"></a><span class="lineno">12254</span>  <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div>
-<div class="line"><a name="l12255"></a><span class="lineno">12255</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12256"></a><span class="lineno">12256</span>  }</div>
-<div class="line"><a name="l12257"></a><span class="lineno">12257</span>  }</div>
-<div class="line"><a name="l12258"></a><span class="lineno">12258</span>  <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div>
-<div class="line"><a name="l12259"></a><span class="lineno">12259</span> <span class="comment"> threads are simultaneously touching allocations making it impossible to make</span></div>
-<div class="line"><a name="l12260"></a><span class="lineno">12260</span> <span class="comment"> lost at the same time as we try to allocate. */</span></div>
-<div class="line"><a name="l12261"></a><span class="lineno">12261</span>  <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div>
-<div class="line"><a name="l12262"></a><span class="lineno">12262</span>  {</div>
-<div class="line"><a name="l12263"></a><span class="lineno">12263</span>  <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div>
-<div class="line"><a name="l12264"></a><span class="lineno">12264</span>  }</div>
-<div class="line"><a name="l12265"></a><span class="lineno">12265</span>  }</div>
-<div class="line"><a name="l12266"></a><span class="lineno">12266</span>  </div>
-<div class="line"><a name="l12267"></a><span class="lineno">12267</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12268"></a><span class="lineno">12268</span> }</div>
-<div class="line"><a name="l12269"></a><span class="lineno">12269</span>  </div>
-<div class="line"><a name="l12270"></a><span class="lineno">12270</span> <span class="keywordtype">void</span> VmaBlockVector::Free(</div>
-<div class="line"><a name="l12271"></a><span class="lineno">12271</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l12272"></a><span class="lineno">12272</span> {</div>
-<div class="line"><a name="l12273"></a><span class="lineno">12273</span>  VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div>
-<div class="line"><a name="l12274"></a><span class="lineno">12274</span>  </div>
-<div class="line"><a name="l12275"></a><span class="lineno">12275</span>  <span class="keywordtype">bool</span> budgetExceeded = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12276"></a><span class="lineno">12276</span>  {</div>
-<div class="line"><a name="l12277"></a><span class="lineno">12277</span>  <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12278"></a><span class="lineno">12278</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l12279"></a><span class="lineno">12279</span>  m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l12280"></a><span class="lineno">12280</span>  budgetExceeded = heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> >= heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
-<div class="line"><a name="l12281"></a><span class="lineno">12281</span>  }</div>
-<div class="line"><a name="l12282"></a><span class="lineno">12282</span>  </div>
-<div class="line"><a name="l12283"></a><span class="lineno">12283</span>  <span class="comment">// Scope for lock.</span></div>
-<div class="line"><a name="l12284"></a><span class="lineno">12284</span>  {</div>
-<div class="line"><a name="l12285"></a><span class="lineno">12285</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l12286"></a><span class="lineno">12286</span>  </div>
-<div class="line"><a name="l12287"></a><span class="lineno">12287</span>  VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();</div>
+<div class="line"><a name="l11953"></a><span class="lineno">11953</span>  <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="l11954"></a><span class="lineno">11954</span>  <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN > m_PreferredBlockSize)</div>
+<div class="line"><a name="l11955"></a><span class="lineno">11955</span>  {</div>
+<div class="line"><a name="l11956"></a><span class="lineno">11956</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l11957"></a><span class="lineno">11957</span>  }</div>
+<div class="line"><a name="l11958"></a><span class="lineno">11958</span>  </div>
+<div class="line"><a name="l11959"></a><span class="lineno">11959</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l11960"></a><span class="lineno">11960</span> <span class="comment"> Under certain condition, this whole section can be skipped for optimization, so</span></div>
+<div class="line"><a name="l11961"></a><span class="lineno">11961</span> <span class="comment"> we move on directly to trying to allocate with canMakeOtherLost. That's the case</span></div>
+<div class="line"><a name="l11962"></a><span class="lineno">11962</span> <span class="comment"> e.g. for custom pools with linear algorithm.</span></div>
+<div class="line"><a name="l11963"></a><span class="lineno">11963</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l11964"></a><span class="lineno">11964</span>  <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div>
+<div class="line"><a name="l11965"></a><span class="lineno">11965</span>  {</div>
+<div class="line"><a name="l11966"></a><span class="lineno">11966</span>  <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div>
+<div class="line"><a name="l11967"></a><span class="lineno">11967</span>  <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="l11968"></a><span class="lineno">11968</span>  allocFlagsCopy &= ~<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="l11969"></a><span class="lineno">11969</span>  </div>
+<div class="line"><a name="l11970"></a><span class="lineno">11970</span>  <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="l11971"></a><span class="lineno">11971</span>  {</div>
+<div class="line"><a name="l11972"></a><span class="lineno">11972</span>  <span class="comment">// Use only last block.</span></div>
+<div class="line"><a name="l11973"></a><span class="lineno">11973</span>  <span class="keywordflow">if</span>(!m_Blocks.empty())</div>
+<div class="line"><a name="l11974"></a><span class="lineno">11974</span>  {</div>
+<div class="line"><a name="l11975"></a><span class="lineno">11975</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div>
+<div class="line"><a name="l11976"></a><span class="lineno">11976</span>  VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l11977"></a><span class="lineno">11977</span>  VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l11978"></a><span class="lineno">11978</span>  pCurrBlock,</div>
+<div class="line"><a name="l11979"></a><span class="lineno">11979</span>  currentFrameIndex,</div>
+<div class="line"><a name="l11980"></a><span class="lineno">11980</span>  size,</div>
+<div class="line"><a name="l11981"></a><span class="lineno">11981</span>  alignment,</div>
+<div class="line"><a name="l11982"></a><span class="lineno">11982</span>  allocFlagsCopy,</div>
+<div class="line"><a name="l11983"></a><span class="lineno">11983</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l11984"></a><span class="lineno">11984</span>  suballocType,</div>
+<div class="line"><a name="l11985"></a><span class="lineno">11985</span>  strategy,</div>
+<div class="line"><a name="l11986"></a><span class="lineno">11986</span>  pAllocation);</div>
+<div class="line"><a name="l11987"></a><span class="lineno">11987</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l11988"></a><span class="lineno">11988</span>  {</div>
+<div class="line"><a name="l11989"></a><span class="lineno">11989</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from last block #%u"</span>, pCurrBlock->GetId());</div>
+<div class="line"><a name="l11990"></a><span class="lineno">11990</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11991"></a><span class="lineno">11991</span>  }</div>
+<div class="line"><a name="l11992"></a><span class="lineno">11992</span>  }</div>
+<div class="line"><a name="l11993"></a><span class="lineno">11993</span>  }</div>
+<div class="line"><a name="l11994"></a><span class="lineno">11994</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11995"></a><span class="lineno">11995</span>  {</div>
+<div class="line"><a name="l11996"></a><span class="lineno">11996</span>  <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="l11997"></a><span class="lineno">11997</span>  {</div>
+<div class="line"><a name="l11998"></a><span class="lineno">11998</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
+<div class="line"><a name="l11999"></a><span class="lineno">11999</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex )</div>
+<div class="line"><a name="l12000"></a><span class="lineno">12000</span>  {</div>
+<div class="line"><a name="l12001"></a><span class="lineno">12001</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12002"></a><span class="lineno">12002</span>  VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12003"></a><span class="lineno">12003</span>  VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l12004"></a><span class="lineno">12004</span>  pCurrBlock,</div>
+<div class="line"><a name="l12005"></a><span class="lineno">12005</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12006"></a><span class="lineno">12006</span>  size,</div>
+<div class="line"><a name="l12007"></a><span class="lineno">12007</span>  alignment,</div>
+<div class="line"><a name="l12008"></a><span class="lineno">12008</span>  allocFlagsCopy,</div>
+<div class="line"><a name="l12009"></a><span class="lineno">12009</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l12010"></a><span class="lineno">12010</span>  suballocType,</div>
+<div class="line"><a name="l12011"></a><span class="lineno">12011</span>  strategy,</div>
+<div class="line"><a name="l12012"></a><span class="lineno">12012</span>  pAllocation);</div>
+<div class="line"><a name="l12013"></a><span class="lineno">12013</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l12014"></a><span class="lineno">12014</span>  {</div>
+<div class="line"><a name="l12015"></a><span class="lineno">12015</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div>
+<div class="line"><a name="l12016"></a><span class="lineno">12016</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12017"></a><span class="lineno">12017</span>  }</div>
+<div class="line"><a name="l12018"></a><span class="lineno">12018</span>  }</div>
+<div class="line"><a name="l12019"></a><span class="lineno">12019</span>  }</div>
+<div class="line"><a name="l12020"></a><span class="lineno">12020</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l12021"></a><span class="lineno">12021</span>  {</div>
+<div class="line"><a name="l12022"></a><span class="lineno">12022</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
+<div class="line"><a name="l12023"></a><span class="lineno">12023</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l12024"></a><span class="lineno">12024</span>  {</div>
+<div class="line"><a name="l12025"></a><span class="lineno">12025</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12026"></a><span class="lineno">12026</span>  VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12027"></a><span class="lineno">12027</span>  VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l12028"></a><span class="lineno">12028</span>  pCurrBlock,</div>
+<div class="line"><a name="l12029"></a><span class="lineno">12029</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12030"></a><span class="lineno">12030</span>  size,</div>
+<div class="line"><a name="l12031"></a><span class="lineno">12031</span>  alignment,</div>
+<div class="line"><a name="l12032"></a><span class="lineno">12032</span>  allocFlagsCopy,</div>
+<div class="line"><a name="l12033"></a><span class="lineno">12033</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l12034"></a><span class="lineno">12034</span>  suballocType,</div>
+<div class="line"><a name="l12035"></a><span class="lineno">12035</span>  strategy,</div>
+<div class="line"><a name="l12036"></a><span class="lineno">12036</span>  pAllocation);</div>
+<div class="line"><a name="l12037"></a><span class="lineno">12037</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l12038"></a><span class="lineno">12038</span>  {</div>
+<div class="line"><a name="l12039"></a><span class="lineno">12039</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div>
+<div class="line"><a name="l12040"></a><span class="lineno">12040</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12041"></a><span class="lineno">12041</span>  }</div>
+<div class="line"><a name="l12042"></a><span class="lineno">12042</span>  }</div>
+<div class="line"><a name="l12043"></a><span class="lineno">12043</span>  }</div>
+<div class="line"><a name="l12044"></a><span class="lineno">12044</span>  }</div>
+<div class="line"><a name="l12045"></a><span class="lineno">12045</span>  </div>
+<div class="line"><a name="l12046"></a><span class="lineno">12046</span>  <span class="comment">// 2. Try to create new block.</span></div>
+<div class="line"><a name="l12047"></a><span class="lineno">12047</span>  <span class="keywordflow">if</span>(canCreateNewBlock)</div>
+<div class="line"><a name="l12048"></a><span class="lineno">12048</span>  {</div>
+<div class="line"><a name="l12049"></a><span class="lineno">12049</span>  <span class="comment">// Calculate optimal size for new block.</span></div>
+<div class="line"><a name="l12050"></a><span class="lineno">12050</span>  VkDeviceSize newBlockSize = m_PreferredBlockSize;</div>
+<div class="line"><a name="l12051"></a><span class="lineno">12051</span>  uint32_t newBlockSizeShift = 0;</div>
+<div class="line"><a name="l12052"></a><span class="lineno">12052</span>  <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div>
+<div class="line"><a name="l12053"></a><span class="lineno">12053</span>  </div>
+<div class="line"><a name="l12054"></a><span class="lineno">12054</span>  <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
+<div class="line"><a name="l12055"></a><span class="lineno">12055</span>  {</div>
+<div class="line"><a name="l12056"></a><span class="lineno">12056</span>  <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div>
+<div class="line"><a name="l12057"></a><span class="lineno">12057</span>  <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div>
+<div class="line"><a name="l12058"></a><span class="lineno">12058</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div>
+<div class="line"><a name="l12059"></a><span class="lineno">12059</span>  {</div>
+<div class="line"><a name="l12060"></a><span class="lineno">12060</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l12061"></a><span class="lineno">12061</span>  <span class="keywordflow">if</span>(smallerNewBlockSize > maxExistingBlockSize && smallerNewBlockSize >= size * 2)</div>
+<div class="line"><a name="l12062"></a><span class="lineno">12062</span>  {</div>
+<div class="line"><a name="l12063"></a><span class="lineno">12063</span>  newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l12064"></a><span class="lineno">12064</span>  ++newBlockSizeShift;</div>
+<div class="line"><a name="l12065"></a><span class="lineno">12065</span>  }</div>
+<div class="line"><a name="l12066"></a><span class="lineno">12066</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12067"></a><span class="lineno">12067</span>  {</div>
+<div class="line"><a name="l12068"></a><span class="lineno">12068</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12069"></a><span class="lineno">12069</span>  }</div>
+<div class="line"><a name="l12070"></a><span class="lineno">12070</span>  }</div>
+<div class="line"><a name="l12071"></a><span class="lineno">12071</span>  }</div>
+<div class="line"><a name="l12072"></a><span class="lineno">12072</span>  </div>
+<div class="line"><a name="l12073"></a><span class="lineno">12073</span>  <span class="keywordtype">size_t</span> newBlockIndex = 0;</div>
+<div class="line"><a name="l12074"></a><span class="lineno">12074</span>  VkResult res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div>
+<div class="line"><a name="l12075"></a><span class="lineno">12075</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12076"></a><span class="lineno">12076</span>  <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="l12077"></a><span class="lineno">12077</span>  <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
+<div class="line"><a name="l12078"></a><span class="lineno">12078</span>  {</div>
+<div class="line"><a name="l12079"></a><span class="lineno">12079</span>  <span class="keywordflow">while</span>(res < 0 && newBlockSizeShift < NEW_BLOCK_SIZE_SHIFT_MAX)</div>
+<div class="line"><a name="l12080"></a><span class="lineno">12080</span>  {</div>
+<div class="line"><a name="l12081"></a><span class="lineno">12081</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l12082"></a><span class="lineno">12082</span>  <span class="keywordflow">if</span>(smallerNewBlockSize >= size)</div>
+<div class="line"><a name="l12083"></a><span class="lineno">12083</span>  {</div>
+<div class="line"><a name="l12084"></a><span class="lineno">12084</span>  newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l12085"></a><span class="lineno">12085</span>  ++newBlockSizeShift;</div>
+<div class="line"><a name="l12086"></a><span class="lineno">12086</span>  res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div>
+<div class="line"><a name="l12087"></a><span class="lineno">12087</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12088"></a><span class="lineno">12088</span>  }</div>
+<div class="line"><a name="l12089"></a><span class="lineno">12089</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12090"></a><span class="lineno">12090</span>  {</div>
+<div class="line"><a name="l12091"></a><span class="lineno">12091</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12092"></a><span class="lineno">12092</span>  }</div>
+<div class="line"><a name="l12093"></a><span class="lineno">12093</span>  }</div>
+<div class="line"><a name="l12094"></a><span class="lineno">12094</span>  }</div>
+<div class="line"><a name="l12095"></a><span class="lineno">12095</span>  </div>
+<div class="line"><a name="l12096"></a><span class="lineno">12096</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l12097"></a><span class="lineno">12097</span>  {</div>
+<div class="line"><a name="l12098"></a><span class="lineno">12098</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div>
+<div class="line"><a name="l12099"></a><span class="lineno">12099</span>  VMA_ASSERT(pBlock->m_pMetadata->GetSize() >= size);</div>
+<div class="line"><a name="l12100"></a><span class="lineno">12100</span>  </div>
+<div class="line"><a name="l12101"></a><span class="lineno">12101</span>  res = AllocateFromBlock(</div>
+<div class="line"><a name="l12102"></a><span class="lineno">12102</span>  pBlock,</div>
+<div class="line"><a name="l12103"></a><span class="lineno">12103</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12104"></a><span class="lineno">12104</span>  size,</div>
+<div class="line"><a name="l12105"></a><span class="lineno">12105</span>  alignment,</div>
+<div class="line"><a name="l12106"></a><span class="lineno">12106</span>  allocFlagsCopy,</div>
+<div class="line"><a name="l12107"></a><span class="lineno">12107</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l12108"></a><span class="lineno">12108</span>  suballocType,</div>
+<div class="line"><a name="l12109"></a><span class="lineno">12109</span>  strategy,</div>
+<div class="line"><a name="l12110"></a><span class="lineno">12110</span>  pAllocation);</div>
+<div class="line"><a name="l12111"></a><span class="lineno">12111</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l12112"></a><span class="lineno">12112</span>  {</div>
+<div class="line"><a name="l12113"></a><span class="lineno">12113</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Created new block #%u Size=%llu"</span>, pBlock->GetId(), newBlockSize);</div>
+<div class="line"><a name="l12114"></a><span class="lineno">12114</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12115"></a><span class="lineno">12115</span>  }</div>
+<div class="line"><a name="l12116"></a><span class="lineno">12116</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12117"></a><span class="lineno">12117</span>  {</div>
+<div class="line"><a name="l12118"></a><span class="lineno">12118</span>  <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div>
+<div class="line"><a name="l12119"></a><span class="lineno">12119</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12120"></a><span class="lineno">12120</span>  }</div>
+<div class="line"><a name="l12121"></a><span class="lineno">12121</span>  }</div>
+<div class="line"><a name="l12122"></a><span class="lineno">12122</span>  }</div>
+<div class="line"><a name="l12123"></a><span class="lineno">12123</span>  }</div>
+<div class="line"><a name="l12124"></a><span class="lineno">12124</span>  </div>
+<div class="line"><a name="l12125"></a><span class="lineno">12125</span>  <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div>
+<div class="line"><a name="l12126"></a><span class="lineno">12126</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div>
+<div class="line"><a name="l12127"></a><span class="lineno">12127</span>  {</div>
+<div class="line"><a name="l12128"></a><span class="lineno">12128</span>  uint32_t tryIndex = 0;</div>
+<div class="line"><a name="l12129"></a><span class="lineno">12129</span>  <span class="keywordflow">for</span>(; tryIndex < VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div>
+<div class="line"><a name="l12130"></a><span class="lineno">12130</span>  {</div>
+<div class="line"><a name="l12131"></a><span class="lineno">12131</span>  VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div>
+<div class="line"><a name="l12132"></a><span class="lineno">12132</span>  VmaAllocationRequest bestRequest = {};</div>
+<div class="line"><a name="l12133"></a><span class="lineno">12133</span>  VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l12134"></a><span class="lineno">12134</span>  </div>
+<div class="line"><a name="l12135"></a><span class="lineno">12135</span>  <span class="comment">// 1. Search existing allocations.</span></div>
+<div class="line"><a name="l12136"></a><span class="lineno">12136</span>  <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="l12137"></a><span class="lineno">12137</span>  {</div>
+<div class="line"><a name="l12138"></a><span class="lineno">12138</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
+<div class="line"><a name="l12139"></a><span class="lineno">12139</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex )</div>
+<div class="line"><a name="l12140"></a><span class="lineno">12140</span>  {</div>
+<div class="line"><a name="l12141"></a><span class="lineno">12141</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12142"></a><span class="lineno">12142</span>  VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12143"></a><span class="lineno">12143</span>  VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12144"></a><span class="lineno">12144</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div>
+<div class="line"><a name="l12145"></a><span class="lineno">12145</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12146"></a><span class="lineno">12146</span>  m_FrameInUseCount,</div>
+<div class="line"><a name="l12147"></a><span class="lineno">12147</span>  m_BufferImageGranularity,</div>
+<div class="line"><a name="l12148"></a><span class="lineno">12148</span>  size,</div>
+<div class="line"><a name="l12149"></a><span class="lineno">12149</span>  alignment,</div>
+<div class="line"><a name="l12150"></a><span class="lineno">12150</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
+<div class="line"><a name="l12151"></a><span class="lineno">12151</span>  suballocType,</div>
+<div class="line"><a name="l12152"></a><span class="lineno">12152</span>  canMakeOtherLost,</div>
+<div class="line"><a name="l12153"></a><span class="lineno">12153</span>  strategy,</div>
+<div class="line"><a name="l12154"></a><span class="lineno">12154</span>  &currRequest))</div>
+<div class="line"><a name="l12155"></a><span class="lineno">12155</span>  {</div>
+<div class="line"><a name="l12156"></a><span class="lineno">12156</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l12157"></a><span class="lineno">12157</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l12158"></a><span class="lineno">12158</span>  currRequestCost < bestRequestCost)</div>
+<div class="line"><a name="l12159"></a><span class="lineno">12159</span>  {</div>
+<div class="line"><a name="l12160"></a><span class="lineno">12160</span>  pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l12161"></a><span class="lineno">12161</span>  bestRequest = currRequest;</div>
+<div class="line"><a name="l12162"></a><span class="lineno">12162</span>  bestRequestCost = currRequestCost;</div>
+<div class="line"><a name="l12163"></a><span class="lineno">12163</span>  </div>
+<div class="line"><a name="l12164"></a><span class="lineno">12164</span>  <span class="keywordflow">if</span>(bestRequestCost == 0)</div>
+<div class="line"><a name="l12165"></a><span class="lineno">12165</span>  {</div>
+<div class="line"><a name="l12166"></a><span class="lineno">12166</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12167"></a><span class="lineno">12167</span>  }</div>
+<div class="line"><a name="l12168"></a><span class="lineno">12168</span>  }</div>
+<div class="line"><a name="l12169"></a><span class="lineno">12169</span>  }</div>
+<div class="line"><a name="l12170"></a><span class="lineno">12170</span>  }</div>
+<div class="line"><a name="l12171"></a><span class="lineno">12171</span>  }</div>
+<div class="line"><a name="l12172"></a><span class="lineno">12172</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l12173"></a><span class="lineno">12173</span>  {</div>
+<div class="line"><a name="l12174"></a><span class="lineno">12174</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
+<div class="line"><a name="l12175"></a><span class="lineno">12175</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l12176"></a><span class="lineno">12176</span>  {</div>
+<div class="line"><a name="l12177"></a><span class="lineno">12177</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12178"></a><span class="lineno">12178</span>  VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l12179"></a><span class="lineno">12179</span>  VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12180"></a><span class="lineno">12180</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div>
+<div class="line"><a name="l12181"></a><span class="lineno">12181</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12182"></a><span class="lineno">12182</span>  m_FrameInUseCount,</div>
+<div class="line"><a name="l12183"></a><span class="lineno">12183</span>  m_BufferImageGranularity,</div>
+<div class="line"><a name="l12184"></a><span class="lineno">12184</span>  size,</div>
+<div class="line"><a name="l12185"></a><span class="lineno">12185</span>  alignment,</div>
+<div class="line"><a name="l12186"></a><span class="lineno">12186</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
+<div class="line"><a name="l12187"></a><span class="lineno">12187</span>  suballocType,</div>
+<div class="line"><a name="l12188"></a><span class="lineno">12188</span>  canMakeOtherLost,</div>
+<div class="line"><a name="l12189"></a><span class="lineno">12189</span>  strategy,</div>
+<div class="line"><a name="l12190"></a><span class="lineno">12190</span>  &currRequest))</div>
+<div class="line"><a name="l12191"></a><span class="lineno">12191</span>  {</div>
+<div class="line"><a name="l12192"></a><span class="lineno">12192</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l12193"></a><span class="lineno">12193</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l12194"></a><span class="lineno">12194</span>  currRequestCost < bestRequestCost ||</div>
+<div class="line"><a name="l12195"></a><span class="lineno">12195</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="l12196"></a><span class="lineno">12196</span>  {</div>
+<div class="line"><a name="l12197"></a><span class="lineno">12197</span>  pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l12198"></a><span class="lineno">12198</span>  bestRequest = currRequest;</div>
+<div class="line"><a name="l12199"></a><span class="lineno">12199</span>  bestRequestCost = currRequestCost;</div>
+<div class="line"><a name="l12200"></a><span class="lineno">12200</span>  </div>
+<div class="line"><a name="l12201"></a><span class="lineno">12201</span>  <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div>
+<div class="line"><a name="l12202"></a><span class="lineno">12202</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="l12203"></a><span class="lineno">12203</span>  {</div>
+<div class="line"><a name="l12204"></a><span class="lineno">12204</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12205"></a><span class="lineno">12205</span>  }</div>
+<div class="line"><a name="l12206"></a><span class="lineno">12206</span>  }</div>
+<div class="line"><a name="l12207"></a><span class="lineno">12207</span>  }</div>
+<div class="line"><a name="l12208"></a><span class="lineno">12208</span>  }</div>
+<div class="line"><a name="l12209"></a><span class="lineno">12209</span>  }</div>
+<div class="line"><a name="l12210"></a><span class="lineno">12210</span>  </div>
+<div class="line"><a name="l12211"></a><span class="lineno">12211</span>  <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div>
+<div class="line"><a name="l12212"></a><span class="lineno">12212</span>  {</div>
+<div class="line"><a name="l12213"></a><span class="lineno">12213</span>  <span class="keywordflow">if</span>(mapped)</div>
+<div class="line"><a name="l12214"></a><span class="lineno">12214</span>  {</div>
+<div class="line"><a name="l12215"></a><span class="lineno">12215</span>  VkResult res = pBestRequestBlock->Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l12216"></a><span class="lineno">12216</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12217"></a><span class="lineno">12217</span>  {</div>
+<div class="line"><a name="l12218"></a><span class="lineno">12218</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12219"></a><span class="lineno">12219</span>  }</div>
+<div class="line"><a name="l12220"></a><span class="lineno">12220</span>  }</div>
+<div class="line"><a name="l12221"></a><span class="lineno">12221</span>  </div>
+<div class="line"><a name="l12222"></a><span class="lineno">12222</span>  <span class="keywordflow">if</span>(pBestRequestBlock->m_pMetadata->MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l12223"></a><span class="lineno">12223</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12224"></a><span class="lineno">12224</span>  m_FrameInUseCount,</div>
+<div class="line"><a name="l12225"></a><span class="lineno">12225</span>  &bestRequest))</div>
+<div class="line"><a name="l12226"></a><span class="lineno">12226</span>  {</div>
+<div class="line"><a name="l12227"></a><span class="lineno">12227</span>  <span class="comment">// Allocate from this pBlock.</span></div>
+<div class="line"><a name="l12228"></a><span class="lineno">12228</span>  *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l12229"></a><span class="lineno">12229</span>  (*pAllocation)->Ctor(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l12230"></a><span class="lineno">12230</span>  pBestRequestBlock->m_pMetadata->Alloc(bestRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l12231"></a><span class="lineno">12231</span>  UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l12232"></a><span class="lineno">12232</span>  (*pAllocation)->InitBlockAllocation(</div>
+<div class="line"><a name="l12233"></a><span class="lineno">12233</span>  pBestRequestBlock,</div>
+<div class="line"><a name="l12234"></a><span class="lineno">12234</span>  bestRequest.offset,</div>
+<div class="line"><a name="l12235"></a><span class="lineno">12235</span>  alignment,</div>
+<div class="line"><a name="l12236"></a><span class="lineno">12236</span>  size,</div>
+<div class="line"><a name="l12237"></a><span class="lineno">12237</span>  m_MemoryTypeIndex,</div>
+<div class="line"><a name="l12238"></a><span class="lineno">12238</span>  suballocType,</div>
+<div class="line"><a name="l12239"></a><span class="lineno">12239</span>  mapped,</div>
+<div class="line"><a name="l12240"></a><span class="lineno">12240</span>  (createInfo.<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>) != 0);</div>
+<div class="line"><a name="l12241"></a><span class="lineno">12241</span>  VMA_HEAVY_ASSERT(pBestRequestBlock->Validate());</div>
+<div class="line"><a name="l12242"></a><span class="lineno">12242</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block"</span>);</div>
+<div class="line"><a name="l12243"></a><span class="lineno">12243</span>  (*pAllocation)->SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l12244"></a><span class="lineno">12244</span>  m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
+<div class="line"><a name="l12245"></a><span class="lineno">12245</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l12246"></a><span class="lineno">12246</span>  {</div>
+<div class="line"><a name="l12247"></a><span class="lineno">12247</span>  m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l12248"></a><span class="lineno">12248</span>  }</div>
+<div class="line"><a name="l12249"></a><span class="lineno">12249</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12250"></a><span class="lineno">12250</span>  {</div>
+<div class="line"><a name="l12251"></a><span class="lineno">12251</span>  VkResult res = pBestRequestBlock->WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div>
+<div class="line"><a name="l12252"></a><span class="lineno">12252</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to write magic value."</span>);</div>
+<div class="line"><a name="l12253"></a><span class="lineno">12253</span>  }</div>
+<div class="line"><a name="l12254"></a><span class="lineno">12254</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12255"></a><span class="lineno">12255</span>  }</div>
+<div class="line"><a name="l12256"></a><span class="lineno">12256</span>  <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div>
+<div class="line"><a name="l12257"></a><span class="lineno">12257</span>  }</div>
+<div class="line"><a name="l12258"></a><span class="lineno">12258</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12259"></a><span class="lineno">12259</span>  {</div>
+<div class="line"><a name="l12260"></a><span class="lineno">12260</span>  <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div>
+<div class="line"><a name="l12261"></a><span class="lineno">12261</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12262"></a><span class="lineno">12262</span>  }</div>
+<div class="line"><a name="l12263"></a><span class="lineno">12263</span>  }</div>
+<div class="line"><a name="l12264"></a><span class="lineno">12264</span>  <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div>
+<div class="line"><a name="l12265"></a><span class="lineno">12265</span> <span class="comment"> threads are simultaneously touching allocations making it impossible to make</span></div>
+<div class="line"><a name="l12266"></a><span class="lineno">12266</span> <span class="comment"> lost at the same time as we try to allocate. */</span></div>
+<div class="line"><a name="l12267"></a><span class="lineno">12267</span>  <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div>
+<div class="line"><a name="l12268"></a><span class="lineno">12268</span>  {</div>
+<div class="line"><a name="l12269"></a><span class="lineno">12269</span>  <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div>
+<div class="line"><a name="l12270"></a><span class="lineno">12270</span>  }</div>
+<div class="line"><a name="l12271"></a><span class="lineno">12271</span>  }</div>
+<div class="line"><a name="l12272"></a><span class="lineno">12272</span>  </div>
+<div class="line"><a name="l12273"></a><span class="lineno">12273</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12274"></a><span class="lineno">12274</span> }</div>
+<div class="line"><a name="l12275"></a><span class="lineno">12275</span>  </div>
+<div class="line"><a name="l12276"></a><span class="lineno">12276</span> <span class="keywordtype">void</span> VmaBlockVector::Free(</div>
+<div class="line"><a name="l12277"></a><span class="lineno">12277</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l12278"></a><span class="lineno">12278</span> {</div>
+<div class="line"><a name="l12279"></a><span class="lineno">12279</span>  VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div>
+<div class="line"><a name="l12280"></a><span class="lineno">12280</span>  </div>
+<div class="line"><a name="l12281"></a><span class="lineno">12281</span>  <span class="keywordtype">bool</span> budgetExceeded = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12282"></a><span class="lineno">12282</span>  {</div>
+<div class="line"><a name="l12283"></a><span class="lineno">12283</span>  <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l12284"></a><span class="lineno">12284</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l12285"></a><span class="lineno">12285</span>  m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l12286"></a><span class="lineno">12286</span>  budgetExceeded = heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> >= heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
+<div class="line"><a name="l12287"></a><span class="lineno">12287</span>  }</div>
<div class="line"><a name="l12288"></a><span class="lineno">12288</span>  </div>
-<div class="line"><a name="l12289"></a><span class="lineno">12289</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12290"></a><span class="lineno">12290</span>  {</div>
-<div class="line"><a name="l12291"></a><span class="lineno">12291</span>  VkResult res = pBlock->ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation->GetOffset(), hAllocation->GetSize());</div>
-<div class="line"><a name="l12292"></a><span class="lineno">12292</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to validate magic value."</span>);</div>
-<div class="line"><a name="l12293"></a><span class="lineno">12293</span>  }</div>
+<div class="line"><a name="l12289"></a><span class="lineno">12289</span>  <span class="comment">// Scope for lock.</span></div>
+<div class="line"><a name="l12290"></a><span class="lineno">12290</span>  {</div>
+<div class="line"><a name="l12291"></a><span class="lineno">12291</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12292"></a><span class="lineno">12292</span>  </div>
+<div class="line"><a name="l12293"></a><span class="lineno">12293</span>  VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();</div>
<div class="line"><a name="l12294"></a><span class="lineno">12294</span>  </div>
-<div class="line"><a name="l12295"></a><span class="lineno">12295</span>  <span class="keywordflow">if</span>(hAllocation->IsPersistentMap())</div>
+<div class="line"><a name="l12295"></a><span class="lineno">12295</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
<div class="line"><a name="l12296"></a><span class="lineno">12296</span>  {</div>
-<div class="line"><a name="l12297"></a><span class="lineno">12297</span>  pBlock->Unmap(m_hAllocator, 1);</div>
-<div class="line"><a name="l12298"></a><span class="lineno">12298</span>  }</div>
-<div class="line"><a name="l12299"></a><span class="lineno">12299</span>  </div>
-<div class="line"><a name="l12300"></a><span class="lineno">12300</span>  pBlock->m_pMetadata->Free(hAllocation);</div>
-<div class="line"><a name="l12301"></a><span class="lineno">12301</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
-<div class="line"><a name="l12302"></a><span class="lineno">12302</span>  </div>
-<div class="line"><a name="l12303"></a><span class="lineno">12303</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Freed from MemoryTypeIndex=%u"</span>, m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12304"></a><span class="lineno">12304</span>  </div>
-<div class="line"><a name="l12305"></a><span class="lineno">12305</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDeleteBlock = m_Blocks.size() > m_MinBlockCount;</div>
-<div class="line"><a name="l12306"></a><span class="lineno">12306</span>  <span class="comment">// pBlock became empty after this deallocation.</span></div>
-<div class="line"><a name="l12307"></a><span class="lineno">12307</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
-<div class="line"><a name="l12308"></a><span class="lineno">12308</span>  {</div>
-<div class="line"><a name="l12309"></a><span class="lineno">12309</span>  <span class="comment">// Already has empty block. We don't want to have two, so delete this one.</span></div>
-<div class="line"><a name="l12310"></a><span class="lineno">12310</span>  <span class="keywordflow">if</span>((m_HasEmptyBlock || budgetExceeded) && canDeleteBlock)</div>
-<div class="line"><a name="l12311"></a><span class="lineno">12311</span>  {</div>
-<div class="line"><a name="l12312"></a><span class="lineno">12312</span>  pBlockToDelete = pBlock;</div>
-<div class="line"><a name="l12313"></a><span class="lineno">12313</span>  Remove(pBlock);</div>
-<div class="line"><a name="l12314"></a><span class="lineno">12314</span>  }</div>
-<div class="line"><a name="l12315"></a><span class="lineno">12315</span>  <span class="comment">// else: We now have an empty block - leave it.</span></div>
-<div class="line"><a name="l12316"></a><span class="lineno">12316</span>  }</div>
-<div class="line"><a name="l12317"></a><span class="lineno">12317</span>  <span class="comment">// pBlock didn't become empty, but we have another empty block - find and free that one.</span></div>
-<div class="line"><a name="l12318"></a><span class="lineno">12318</span>  <span class="comment">// (This is optional, heuristics.)</span></div>
-<div class="line"><a name="l12319"></a><span class="lineno">12319</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock && canDeleteBlock)</div>
-<div class="line"><a name="l12320"></a><span class="lineno">12320</span>  {</div>
-<div class="line"><a name="l12321"></a><span class="lineno">12321</span>  VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div>
-<div class="line"><a name="l12322"></a><span class="lineno">12322</span>  <span class="keywordflow">if</span>(pLastBlock->m_pMetadata->IsEmpty())</div>
-<div class="line"><a name="l12323"></a><span class="lineno">12323</span>  {</div>
-<div class="line"><a name="l12324"></a><span class="lineno">12324</span>  pBlockToDelete = pLastBlock;</div>
-<div class="line"><a name="l12325"></a><span class="lineno">12325</span>  m_Blocks.pop_back();</div>
-<div class="line"><a name="l12326"></a><span class="lineno">12326</span>  }</div>
-<div class="line"><a name="l12327"></a><span class="lineno">12327</span>  }</div>
-<div class="line"><a name="l12328"></a><span class="lineno">12328</span>  </div>
-<div class="line"><a name="l12329"></a><span class="lineno">12329</span>  UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12330"></a><span class="lineno">12330</span>  IncrementallySortBlocks();</div>
-<div class="line"><a name="l12331"></a><span class="lineno">12331</span>  }</div>
-<div class="line"><a name="l12332"></a><span class="lineno">12332</span>  </div>
-<div class="line"><a name="l12333"></a><span class="lineno">12333</span>  <span class="comment">// Destruction of a free block. Deferred until this point, outside of mutex</span></div>
-<div class="line"><a name="l12334"></a><span class="lineno">12334</span>  <span class="comment">// lock, for performance reason.</span></div>
-<div class="line"><a name="l12335"></a><span class="lineno">12335</span>  <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div>
-<div class="line"><a name="l12336"></a><span class="lineno">12336</span>  {</div>
-<div class="line"><a name="l12337"></a><span class="lineno">12337</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Deleted empty block"</span>);</div>
-<div class="line"><a name="l12338"></a><span class="lineno">12338</span>  pBlockToDelete->Destroy(m_hAllocator);</div>
-<div class="line"><a name="l12339"></a><span class="lineno">12339</span>  vma_delete(m_hAllocator, pBlockToDelete);</div>
-<div class="line"><a name="l12340"></a><span class="lineno">12340</span>  }</div>
-<div class="line"><a name="l12341"></a><span class="lineno">12341</span> }</div>
-<div class="line"><a name="l12342"></a><span class="lineno">12342</span>  </div>
-<div class="line"><a name="l12343"></a><span class="lineno">12343</span> VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12344"></a><span class="lineno">12344</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l12345"></a><span class="lineno">12345</span>  VkDeviceSize result = 0;</div>
-<div class="line"><a name="l12346"></a><span class="lineno">12346</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
-<div class="line"><a name="l12347"></a><span class="lineno">12347</span>  {</div>
-<div class="line"><a name="l12348"></a><span class="lineno">12348</span>  result = VMA_MAX(result, m_Blocks[i]->m_pMetadata->GetSize());</div>
-<div class="line"><a name="l12349"></a><span class="lineno">12349</span>  <span class="keywordflow">if</span>(result >= m_PreferredBlockSize)</div>
-<div class="line"><a name="l12350"></a><span class="lineno">12350</span>  {</div>
-<div class="line"><a name="l12351"></a><span class="lineno">12351</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12352"></a><span class="lineno">12352</span>  }</div>
-<div class="line"><a name="l12353"></a><span class="lineno">12353</span>  }</div>
-<div class="line"><a name="l12354"></a><span class="lineno">12354</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l12355"></a><span class="lineno">12355</span> }</div>
-<div class="line"><a name="l12356"></a><span class="lineno">12356</span>  </div>
-<div class="line"><a name="l12357"></a><span class="lineno">12357</span> <span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div>
-<div class="line"><a name="l12358"></a><span class="lineno">12358</span> {</div>
-<div class="line"><a name="l12359"></a><span class="lineno">12359</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l12360"></a><span class="lineno">12360</span>  {</div>
-<div class="line"><a name="l12361"></a><span class="lineno">12361</span>  <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div>
-<div class="line"><a name="l12362"></a><span class="lineno">12362</span>  {</div>
-<div class="line"><a name="l12363"></a><span class="lineno">12363</span>  VmaVectorRemove(m_Blocks, blockIndex);</div>
-<div class="line"><a name="l12364"></a><span class="lineno">12364</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l12365"></a><span class="lineno">12365</span>  }</div>
-<div class="line"><a name="l12366"></a><span class="lineno">12366</span>  }</div>
-<div class="line"><a name="l12367"></a><span class="lineno">12367</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l12368"></a><span class="lineno">12368</span> }</div>
-<div class="line"><a name="l12369"></a><span class="lineno">12369</span>  </div>
-<div class="line"><a name="l12370"></a><span class="lineno">12370</span> <span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div>
-<div class="line"><a name="l12371"></a><span class="lineno">12371</span> {</div>
-<div class="line"><a name="l12372"></a><span class="lineno">12372</span>  <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="l12373"></a><span class="lineno">12373</span>  {</div>
-<div class="line"><a name="l12374"></a><span class="lineno">12374</span>  <span class="comment">// Bubble sort only until first swap.</span></div>
-<div class="line"><a name="l12375"></a><span class="lineno">12375</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i < m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l12376"></a><span class="lineno">12376</span>  {</div>
-<div class="line"><a name="l12377"></a><span class="lineno">12377</span>  <span class="keywordflow">if</span>(m_Blocks[i - 1]->m_pMetadata->GetSumFreeSize() > m_Blocks[i]->m_pMetadata->GetSumFreeSize())</div>
-<div class="line"><a name="l12378"></a><span class="lineno">12378</span>  {</div>
-<div class="line"><a name="l12379"></a><span class="lineno">12379</span>  VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div>
-<div class="line"><a name="l12380"></a><span class="lineno">12380</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l12381"></a><span class="lineno">12381</span>  }</div>
-<div class="line"><a name="l12382"></a><span class="lineno">12382</span>  }</div>
-<div class="line"><a name="l12383"></a><span class="lineno">12383</span>  }</div>
-<div class="line"><a name="l12384"></a><span class="lineno">12384</span> }</div>
-<div class="line"><a name="l12385"></a><span class="lineno">12385</span>  </div>
-<div class="line"><a name="l12386"></a><span class="lineno">12386</span> VkResult VmaBlockVector::AllocateFromBlock(</div>
-<div class="line"><a name="l12387"></a><span class="lineno">12387</span>  VmaDeviceMemoryBlock* pBlock,</div>
-<div class="line"><a name="l12388"></a><span class="lineno">12388</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l12389"></a><span class="lineno">12389</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l12390"></a><span class="lineno">12390</span>  VkDeviceSize alignment,</div>
-<div class="line"><a name="l12391"></a><span class="lineno">12391</span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
-<div class="line"><a name="l12392"></a><span class="lineno">12392</span>  <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l12393"></a><span class="lineno">12393</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l12394"></a><span class="lineno">12394</span>  uint32_t strategy,</div>
-<div class="line"><a name="l12395"></a><span class="lineno">12395</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l12396"></a><span class="lineno">12396</span> {</div>
-<div class="line"><a name="l12397"></a><span class="lineno">12397</span>  VMA_ASSERT((allocFlags & <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="l12398"></a><span class="lineno">12398</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
-<div class="line"><a name="l12399"></a><span class="lineno">12399</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
-<div class="line"><a name="l12400"></a><span class="lineno">12400</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags & <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="l12401"></a><span class="lineno">12401</span>  </div>
-<div class="line"><a name="l12402"></a><span class="lineno">12402</span>  VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l12403"></a><span class="lineno">12403</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->CreateAllocationRequest(</div>
-<div class="line"><a name="l12404"></a><span class="lineno">12404</span>  currentFrameIndex,</div>
-<div class="line"><a name="l12405"></a><span class="lineno">12405</span>  m_FrameInUseCount,</div>
-<div class="line"><a name="l12406"></a><span class="lineno">12406</span>  m_BufferImageGranularity,</div>
-<div class="line"><a name="l12407"></a><span class="lineno">12407</span>  size,</div>
-<div class="line"><a name="l12408"></a><span class="lineno">12408</span>  alignment,</div>
-<div class="line"><a name="l12409"></a><span class="lineno">12409</span>  isUpperAddress,</div>
-<div class="line"><a name="l12410"></a><span class="lineno">12410</span>  suballocType,</div>
-<div class="line"><a name="l12411"></a><span class="lineno">12411</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l12412"></a><span class="lineno">12412</span>  strategy,</div>
-<div class="line"><a name="l12413"></a><span class="lineno">12413</span>  &currRequest))</div>
-<div class="line"><a name="l12414"></a><span class="lineno">12414</span>  {</div>
-<div class="line"><a name="l12415"></a><span class="lineno">12415</span>  <span class="comment">// Allocate from pCurrBlock.</span></div>
-<div class="line"><a name="l12416"></a><span class="lineno">12416</span>  VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div>
-<div class="line"><a name="l12417"></a><span class="lineno">12417</span>  </div>
-<div class="line"><a name="l12418"></a><span class="lineno">12418</span>  <span class="keywordflow">if</span>(mapped)</div>
-<div class="line"><a name="l12419"></a><span class="lineno">12419</span>  {</div>
-<div class="line"><a name="l12420"></a><span class="lineno">12420</span>  VkResult res = pBlock->Map(m_hAllocator, 1, VMA_NULL);</div>
-<div class="line"><a name="l12421"></a><span class="lineno">12421</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12422"></a><span class="lineno">12422</span>  {</div>
-<div class="line"><a name="l12423"></a><span class="lineno">12423</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12424"></a><span class="lineno">12424</span>  }</div>
-<div class="line"><a name="l12425"></a><span class="lineno">12425</span>  }</div>
-<div class="line"><a name="l12426"></a><span class="lineno">12426</span>  </div>
-<div class="line"><a name="l12427"></a><span class="lineno">12427</span>  *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate();</div>
-<div class="line"><a name="l12428"></a><span class="lineno">12428</span>  (*pAllocation)->Ctor(currentFrameIndex, isUserDataString);</div>
-<div class="line"><a name="l12429"></a><span class="lineno">12429</span>  pBlock->m_pMetadata->Alloc(currRequest, suballocType, size, *pAllocation);</div>
-<div class="line"><a name="l12430"></a><span class="lineno">12430</span>  UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12431"></a><span class="lineno">12431</span>  (*pAllocation)->InitBlockAllocation(</div>
-<div class="line"><a name="l12432"></a><span class="lineno">12432</span>  pBlock,</div>
-<div class="line"><a name="l12433"></a><span class="lineno">12433</span>  currRequest.offset,</div>
-<div class="line"><a name="l12434"></a><span class="lineno">12434</span>  alignment,</div>
-<div class="line"><a name="l12435"></a><span class="lineno">12435</span>  size,</div>
-<div class="line"><a name="l12436"></a><span class="lineno">12436</span>  m_MemoryTypeIndex,</div>
-<div class="line"><a name="l12437"></a><span class="lineno">12437</span>  suballocType,</div>
-<div class="line"><a name="l12438"></a><span class="lineno">12438</span>  mapped,</div>
-<div class="line"><a name="l12439"></a><span class="lineno">12439</span>  (allocFlags & <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="l12440"></a><span class="lineno">12440</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
-<div class="line"><a name="l12441"></a><span class="lineno">12441</span>  (*pAllocation)->SetUserData(m_hAllocator, pUserData);</div>
-<div class="line"><a name="l12442"></a><span class="lineno">12442</span>  m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
-<div class="line"><a name="l12443"></a><span class="lineno">12443</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l12444"></a><span class="lineno">12444</span>  {</div>
-<div class="line"><a name="l12445"></a><span class="lineno">12445</span>  m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l12446"></a><span class="lineno">12446</span>  }</div>
-<div class="line"><a name="l12447"></a><span class="lineno">12447</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12448"></a><span class="lineno">12448</span>  {</div>
-<div class="line"><a name="l12449"></a><span class="lineno">12449</span>  VkResult res = pBlock->WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div>
-<div class="line"><a name="l12450"></a><span class="lineno">12450</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to write magic value."</span>);</div>
-<div class="line"><a name="l12451"></a><span class="lineno">12451</span>  }</div>
-<div class="line"><a name="l12452"></a><span class="lineno">12452</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12453"></a><span class="lineno">12453</span>  }</div>
-<div class="line"><a name="l12454"></a><span class="lineno">12454</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12455"></a><span class="lineno">12455</span> }</div>
-<div class="line"><a name="l12456"></a><span class="lineno">12456</span>  </div>
-<div class="line"><a name="l12457"></a><span class="lineno">12457</span> VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div>
-<div class="line"><a name="l12458"></a><span class="lineno">12458</span> {</div>
-<div class="line"><a name="l12459"></a><span class="lineno">12459</span>  VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
-<div class="line"><a name="l12460"></a><span class="lineno">12460</span>  allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div>
-<div class="line"><a name="l12461"></a><span class="lineno">12461</span>  allocInfo.allocationSize = blockSize;</div>
-<div class="line"><a name="l12462"></a><span class="lineno">12462</span>  VkDeviceMemory mem = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l12463"></a><span class="lineno">12463</span>  VkResult res = m_hAllocator->AllocateVulkanMemory(&allocInfo, &mem);</div>
-<div class="line"><a name="l12464"></a><span class="lineno">12464</span>  <span class="keywordflow">if</span>(res < 0)</div>
-<div class="line"><a name="l12465"></a><span class="lineno">12465</span>  {</div>
-<div class="line"><a name="l12466"></a><span class="lineno">12466</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12467"></a><span class="lineno">12467</span>  }</div>
-<div class="line"><a name="l12468"></a><span class="lineno">12468</span>  </div>
-<div class="line"><a name="l12469"></a><span class="lineno">12469</span>  <span class="comment">// New VkDeviceMemory successfully created.</span></div>
-<div class="line"><a name="l12470"></a><span class="lineno">12470</span>  </div>
-<div class="line"><a name="l12471"></a><span class="lineno">12471</span>  <span class="comment">// Create new Allocation for it.</span></div>
-<div class="line"><a name="l12472"></a><span class="lineno">12472</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div>
-<div class="line"><a name="l12473"></a><span class="lineno">12473</span>  pBlock->Init(</div>
-<div class="line"><a name="l12474"></a><span class="lineno">12474</span>  m_hAllocator,</div>
-<div class="line"><a name="l12475"></a><span class="lineno">12475</span>  m_hParentPool,</div>
-<div class="line"><a name="l12476"></a><span class="lineno">12476</span>  m_MemoryTypeIndex,</div>
-<div class="line"><a name="l12477"></a><span class="lineno">12477</span>  mem,</div>
-<div class="line"><a name="l12478"></a><span class="lineno">12478</span>  allocInfo.allocationSize,</div>
-<div class="line"><a name="l12479"></a><span class="lineno">12479</span>  m_NextBlockId++,</div>
-<div class="line"><a name="l12480"></a><span class="lineno">12480</span>  m_Algorithm);</div>
-<div class="line"><a name="l12481"></a><span class="lineno">12481</span>  </div>
-<div class="line"><a name="l12482"></a><span class="lineno">12482</span>  m_Blocks.push_back(pBlock);</div>
-<div class="line"><a name="l12483"></a><span class="lineno">12483</span>  <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div>
-<div class="line"><a name="l12484"></a><span class="lineno">12484</span>  {</div>
-<div class="line"><a name="l12485"></a><span class="lineno">12485</span>  *pNewBlockIndex = m_Blocks.size() - 1;</div>
-<div class="line"><a name="l12486"></a><span class="lineno">12486</span>  }</div>
+<div class="line"><a name="l12297"></a><span class="lineno">12297</span>  VkResult res = pBlock->ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation->GetOffset(), hAllocation->GetSize());</div>
+<div class="line"><a name="l12298"></a><span class="lineno">12298</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to validate magic value."</span>);</div>
+<div class="line"><a name="l12299"></a><span class="lineno">12299</span>  }</div>
+<div class="line"><a name="l12300"></a><span class="lineno">12300</span>  </div>
+<div class="line"><a name="l12301"></a><span class="lineno">12301</span>  <span class="keywordflow">if</span>(hAllocation->IsPersistentMap())</div>
+<div class="line"><a name="l12302"></a><span class="lineno">12302</span>  {</div>
+<div class="line"><a name="l12303"></a><span class="lineno">12303</span>  pBlock->Unmap(m_hAllocator, 1);</div>
+<div class="line"><a name="l12304"></a><span class="lineno">12304</span>  }</div>
+<div class="line"><a name="l12305"></a><span class="lineno">12305</span>  </div>
+<div class="line"><a name="l12306"></a><span class="lineno">12306</span>  pBlock->m_pMetadata->Free(hAllocation);</div>
+<div class="line"><a name="l12307"></a><span class="lineno">12307</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
+<div class="line"><a name="l12308"></a><span class="lineno">12308</span>  </div>
+<div class="line"><a name="l12309"></a><span class="lineno">12309</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Freed from MemoryTypeIndex=%u"</span>, m_MemoryTypeIndex);</div>
+<div class="line"><a name="l12310"></a><span class="lineno">12310</span>  </div>
+<div class="line"><a name="l12311"></a><span class="lineno">12311</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDeleteBlock = m_Blocks.size() > m_MinBlockCount;</div>
+<div class="line"><a name="l12312"></a><span class="lineno">12312</span>  <span class="comment">// pBlock became empty after this deallocation.</span></div>
+<div class="line"><a name="l12313"></a><span class="lineno">12313</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
+<div class="line"><a name="l12314"></a><span class="lineno">12314</span>  {</div>
+<div class="line"><a name="l12315"></a><span class="lineno">12315</span>  <span class="comment">// Already has empty block. We don't want to have two, so delete this one.</span></div>
+<div class="line"><a name="l12316"></a><span class="lineno">12316</span>  <span class="keywordflow">if</span>((m_HasEmptyBlock || budgetExceeded) && canDeleteBlock)</div>
+<div class="line"><a name="l12317"></a><span class="lineno">12317</span>  {</div>
+<div class="line"><a name="l12318"></a><span class="lineno">12318</span>  pBlockToDelete = pBlock;</div>
+<div class="line"><a name="l12319"></a><span class="lineno">12319</span>  Remove(pBlock);</div>
+<div class="line"><a name="l12320"></a><span class="lineno">12320</span>  }</div>
+<div class="line"><a name="l12321"></a><span class="lineno">12321</span>  <span class="comment">// else: We now have an empty block - leave it.</span></div>
+<div class="line"><a name="l12322"></a><span class="lineno">12322</span>  }</div>
+<div class="line"><a name="l12323"></a><span class="lineno">12323</span>  <span class="comment">// pBlock didn't become empty, but we have another empty block - find and free that one.</span></div>
+<div class="line"><a name="l12324"></a><span class="lineno">12324</span>  <span class="comment">// (This is optional, heuristics.)</span></div>
+<div class="line"><a name="l12325"></a><span class="lineno">12325</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock && canDeleteBlock)</div>
+<div class="line"><a name="l12326"></a><span class="lineno">12326</span>  {</div>
+<div class="line"><a name="l12327"></a><span class="lineno">12327</span>  VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div>
+<div class="line"><a name="l12328"></a><span class="lineno">12328</span>  <span class="keywordflow">if</span>(pLastBlock->m_pMetadata->IsEmpty())</div>
+<div class="line"><a name="l12329"></a><span class="lineno">12329</span>  {</div>
+<div class="line"><a name="l12330"></a><span class="lineno">12330</span>  pBlockToDelete = pLastBlock;</div>
+<div class="line"><a name="l12331"></a><span class="lineno">12331</span>  m_Blocks.pop_back();</div>
+<div class="line"><a name="l12332"></a><span class="lineno">12332</span>  }</div>
+<div class="line"><a name="l12333"></a><span class="lineno">12333</span>  }</div>
+<div class="line"><a name="l12334"></a><span class="lineno">12334</span>  </div>
+<div class="line"><a name="l12335"></a><span class="lineno">12335</span>  UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l12336"></a><span class="lineno">12336</span>  IncrementallySortBlocks();</div>
+<div class="line"><a name="l12337"></a><span class="lineno">12337</span>  }</div>
+<div class="line"><a name="l12338"></a><span class="lineno">12338</span>  </div>
+<div class="line"><a name="l12339"></a><span class="lineno">12339</span>  <span class="comment">// Destruction of a free block. Deferred until this point, outside of mutex</span></div>
+<div class="line"><a name="l12340"></a><span class="lineno">12340</span>  <span class="comment">// lock, for performance reason.</span></div>
+<div class="line"><a name="l12341"></a><span class="lineno">12341</span>  <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div>
+<div class="line"><a name="l12342"></a><span class="lineno">12342</span>  {</div>
+<div class="line"><a name="l12343"></a><span class="lineno">12343</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Deleted empty block"</span>);</div>
+<div class="line"><a name="l12344"></a><span class="lineno">12344</span>  pBlockToDelete->Destroy(m_hAllocator);</div>
+<div class="line"><a name="l12345"></a><span class="lineno">12345</span>  vma_delete(m_hAllocator, pBlockToDelete);</div>
+<div class="line"><a name="l12346"></a><span class="lineno">12346</span>  }</div>
+<div class="line"><a name="l12347"></a><span class="lineno">12347</span> }</div>
+<div class="line"><a name="l12348"></a><span class="lineno">12348</span>  </div>
+<div class="line"><a name="l12349"></a><span class="lineno">12349</span> VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12350"></a><span class="lineno">12350</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l12351"></a><span class="lineno">12351</span>  VkDeviceSize result = 0;</div>
+<div class="line"><a name="l12352"></a><span class="lineno">12352</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l12353"></a><span class="lineno">12353</span>  {</div>
+<div class="line"><a name="l12354"></a><span class="lineno">12354</span>  result = VMA_MAX(result, m_Blocks[i]->m_pMetadata->GetSize());</div>
+<div class="line"><a name="l12355"></a><span class="lineno">12355</span>  <span class="keywordflow">if</span>(result >= m_PreferredBlockSize)</div>
+<div class="line"><a name="l12356"></a><span class="lineno">12356</span>  {</div>
+<div class="line"><a name="l12357"></a><span class="lineno">12357</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12358"></a><span class="lineno">12358</span>  }</div>
+<div class="line"><a name="l12359"></a><span class="lineno">12359</span>  }</div>
+<div class="line"><a name="l12360"></a><span class="lineno">12360</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l12361"></a><span class="lineno">12361</span> }</div>
+<div class="line"><a name="l12362"></a><span class="lineno">12362</span>  </div>
+<div class="line"><a name="l12363"></a><span class="lineno">12363</span> <span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div>
+<div class="line"><a name="l12364"></a><span class="lineno">12364</span> {</div>
+<div class="line"><a name="l12365"></a><span class="lineno">12365</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12366"></a><span class="lineno">12366</span>  {</div>
+<div class="line"><a name="l12367"></a><span class="lineno">12367</span>  <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div>
+<div class="line"><a name="l12368"></a><span class="lineno">12368</span>  {</div>
+<div class="line"><a name="l12369"></a><span class="lineno">12369</span>  VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l12370"></a><span class="lineno">12370</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l12371"></a><span class="lineno">12371</span>  }</div>
+<div class="line"><a name="l12372"></a><span class="lineno">12372</span>  }</div>
+<div class="line"><a name="l12373"></a><span class="lineno">12373</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l12374"></a><span class="lineno">12374</span> }</div>
+<div class="line"><a name="l12375"></a><span class="lineno">12375</span>  </div>
+<div class="line"><a name="l12376"></a><span class="lineno">12376</span> <span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div>
+<div class="line"><a name="l12377"></a><span class="lineno">12377</span> {</div>
+<div class="line"><a name="l12378"></a><span class="lineno">12378</span>  <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="l12379"></a><span class="lineno">12379</span>  {</div>
+<div class="line"><a name="l12380"></a><span class="lineno">12380</span>  <span class="comment">// Bubble sort only until first swap.</span></div>
+<div class="line"><a name="l12381"></a><span class="lineno">12381</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i < m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l12382"></a><span class="lineno">12382</span>  {</div>
+<div class="line"><a name="l12383"></a><span class="lineno">12383</span>  <span class="keywordflow">if</span>(m_Blocks[i - 1]->m_pMetadata->GetSumFreeSize() > m_Blocks[i]->m_pMetadata->GetSumFreeSize())</div>
+<div class="line"><a name="l12384"></a><span class="lineno">12384</span>  {</div>
+<div class="line"><a name="l12385"></a><span class="lineno">12385</span>  VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div>
+<div class="line"><a name="l12386"></a><span class="lineno">12386</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l12387"></a><span class="lineno">12387</span>  }</div>
+<div class="line"><a name="l12388"></a><span class="lineno">12388</span>  }</div>
+<div class="line"><a name="l12389"></a><span class="lineno">12389</span>  }</div>
+<div class="line"><a name="l12390"></a><span class="lineno">12390</span> }</div>
+<div class="line"><a name="l12391"></a><span class="lineno">12391</span>  </div>
+<div class="line"><a name="l12392"></a><span class="lineno">12392</span> VkResult VmaBlockVector::AllocateFromBlock(</div>
+<div class="line"><a name="l12393"></a><span class="lineno">12393</span>  VmaDeviceMemoryBlock* pBlock,</div>
+<div class="line"><a name="l12394"></a><span class="lineno">12394</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12395"></a><span class="lineno">12395</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l12396"></a><span class="lineno">12396</span>  VkDeviceSize alignment,</div>
+<div class="line"><a name="l12397"></a><span class="lineno">12397</span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
+<div class="line"><a name="l12398"></a><span class="lineno">12398</span>  <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l12399"></a><span class="lineno">12399</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l12400"></a><span class="lineno">12400</span>  uint32_t strategy,</div>
+<div class="line"><a name="l12401"></a><span class="lineno">12401</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l12402"></a><span class="lineno">12402</span> {</div>
+<div class="line"><a name="l12403"></a><span class="lineno">12403</span>  VMA_ASSERT((allocFlags & <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="l12404"></a><span class="lineno">12404</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
+<div class="line"><a name="l12405"></a><span class="lineno">12405</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
+<div class="line"><a name="l12406"></a><span class="lineno">12406</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags & <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="l12407"></a><span class="lineno">12407</span>  </div>
+<div class="line"><a name="l12408"></a><span class="lineno">12408</span>  VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l12409"></a><span class="lineno">12409</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->CreateAllocationRequest(</div>
+<div class="line"><a name="l12410"></a><span class="lineno">12410</span>  currentFrameIndex,</div>
+<div class="line"><a name="l12411"></a><span class="lineno">12411</span>  m_FrameInUseCount,</div>
+<div class="line"><a name="l12412"></a><span class="lineno">12412</span>  m_BufferImageGranularity,</div>
+<div class="line"><a name="l12413"></a><span class="lineno">12413</span>  size,</div>
+<div class="line"><a name="l12414"></a><span class="lineno">12414</span>  alignment,</div>
+<div class="line"><a name="l12415"></a><span class="lineno">12415</span>  isUpperAddress,</div>
+<div class="line"><a name="l12416"></a><span class="lineno">12416</span>  suballocType,</div>
+<div class="line"><a name="l12417"></a><span class="lineno">12417</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l12418"></a><span class="lineno">12418</span>  strategy,</div>
+<div class="line"><a name="l12419"></a><span class="lineno">12419</span>  &currRequest))</div>
+<div class="line"><a name="l12420"></a><span class="lineno">12420</span>  {</div>
+<div class="line"><a name="l12421"></a><span class="lineno">12421</span>  <span class="comment">// Allocate from pCurrBlock.</span></div>
+<div class="line"><a name="l12422"></a><span class="lineno">12422</span>  VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div>
+<div class="line"><a name="l12423"></a><span class="lineno">12423</span>  </div>
+<div class="line"><a name="l12424"></a><span class="lineno">12424</span>  <span class="keywordflow">if</span>(mapped)</div>
+<div class="line"><a name="l12425"></a><span class="lineno">12425</span>  {</div>
+<div class="line"><a name="l12426"></a><span class="lineno">12426</span>  VkResult res = pBlock->Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l12427"></a><span class="lineno">12427</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12428"></a><span class="lineno">12428</span>  {</div>
+<div class="line"><a name="l12429"></a><span class="lineno">12429</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12430"></a><span class="lineno">12430</span>  }</div>
+<div class="line"><a name="l12431"></a><span class="lineno">12431</span>  }</div>
+<div class="line"><a name="l12432"></a><span class="lineno">12432</span>  </div>
+<div class="line"><a name="l12433"></a><span class="lineno">12433</span>  *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l12434"></a><span class="lineno">12434</span>  (*pAllocation)->Ctor(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l12435"></a><span class="lineno">12435</span>  pBlock->m_pMetadata->Alloc(currRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l12436"></a><span class="lineno">12436</span>  UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l12437"></a><span class="lineno">12437</span>  (*pAllocation)->InitBlockAllocation(</div>
+<div class="line"><a name="l12438"></a><span class="lineno">12438</span>  pBlock,</div>
+<div class="line"><a name="l12439"></a><span class="lineno">12439</span>  currRequest.offset,</div>
+<div class="line"><a name="l12440"></a><span class="lineno">12440</span>  alignment,</div>
+<div class="line"><a name="l12441"></a><span class="lineno">12441</span>  size,</div>
+<div class="line"><a name="l12442"></a><span class="lineno">12442</span>  m_MemoryTypeIndex,</div>
+<div class="line"><a name="l12443"></a><span class="lineno">12443</span>  suballocType,</div>
+<div class="line"><a name="l12444"></a><span class="lineno">12444</span>  mapped,</div>
+<div class="line"><a name="l12445"></a><span class="lineno">12445</span>  (allocFlags & <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="l12446"></a><span class="lineno">12446</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
+<div class="line"><a name="l12447"></a><span class="lineno">12447</span>  (*pAllocation)->SetUserData(m_hAllocator, pUserData);</div>
+<div class="line"><a name="l12448"></a><span class="lineno">12448</span>  m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
+<div class="line"><a name="l12449"></a><span class="lineno">12449</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l12450"></a><span class="lineno">12450</span>  {</div>
+<div class="line"><a name="l12451"></a><span class="lineno">12451</span>  m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l12452"></a><span class="lineno">12452</span>  }</div>
+<div class="line"><a name="l12453"></a><span class="lineno">12453</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12454"></a><span class="lineno">12454</span>  {</div>
+<div class="line"><a name="l12455"></a><span class="lineno">12455</span>  VkResult res = pBlock->WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div>
+<div class="line"><a name="l12456"></a><span class="lineno">12456</span>  VMA_ASSERT(res == VK_SUCCESS && <span class="stringliteral">"Couldn't map block memory to write magic value."</span>);</div>
+<div class="line"><a name="l12457"></a><span class="lineno">12457</span>  }</div>
+<div class="line"><a name="l12458"></a><span class="lineno">12458</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12459"></a><span class="lineno">12459</span>  }</div>
+<div class="line"><a name="l12460"></a><span class="lineno">12460</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l12461"></a><span class="lineno">12461</span> }</div>
+<div class="line"><a name="l12462"></a><span class="lineno">12462</span>  </div>
+<div class="line"><a name="l12463"></a><span class="lineno">12463</span> VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div>
+<div class="line"><a name="l12464"></a><span class="lineno">12464</span> {</div>
+<div class="line"><a name="l12465"></a><span class="lineno">12465</span>  VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l12466"></a><span class="lineno">12466</span>  allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l12467"></a><span class="lineno">12467</span>  allocInfo.allocationSize = blockSize;</div>
+<div class="line"><a name="l12468"></a><span class="lineno">12468</span>  VkDeviceMemory mem = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l12469"></a><span class="lineno">12469</span>  VkResult res = m_hAllocator->AllocateVulkanMemory(&allocInfo, &mem);</div>
+<div class="line"><a name="l12470"></a><span class="lineno">12470</span>  <span class="keywordflow">if</span>(res < 0)</div>
+<div class="line"><a name="l12471"></a><span class="lineno">12471</span>  {</div>
+<div class="line"><a name="l12472"></a><span class="lineno">12472</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12473"></a><span class="lineno">12473</span>  }</div>
+<div class="line"><a name="l12474"></a><span class="lineno">12474</span>  </div>
+<div class="line"><a name="l12475"></a><span class="lineno">12475</span>  <span class="comment">// New VkDeviceMemory successfully created.</span></div>
+<div class="line"><a name="l12476"></a><span class="lineno">12476</span>  </div>
+<div class="line"><a name="l12477"></a><span class="lineno">12477</span>  <span class="comment">// Create new Allocation for it.</span></div>
+<div class="line"><a name="l12478"></a><span class="lineno">12478</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div>
+<div class="line"><a name="l12479"></a><span class="lineno">12479</span>  pBlock->Init(</div>
+<div class="line"><a name="l12480"></a><span class="lineno">12480</span>  m_hAllocator,</div>
+<div class="line"><a name="l12481"></a><span class="lineno">12481</span>  m_hParentPool,</div>
+<div class="line"><a name="l12482"></a><span class="lineno">12482</span>  m_MemoryTypeIndex,</div>
+<div class="line"><a name="l12483"></a><span class="lineno">12483</span>  mem,</div>
+<div class="line"><a name="l12484"></a><span class="lineno">12484</span>  allocInfo.allocationSize,</div>
+<div class="line"><a name="l12485"></a><span class="lineno">12485</span>  m_NextBlockId++,</div>
+<div class="line"><a name="l12486"></a><span class="lineno">12486</span>  m_Algorithm);</div>
<div class="line"><a name="l12487"></a><span class="lineno">12487</span>  </div>
-<div class="line"><a name="l12488"></a><span class="lineno">12488</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12489"></a><span class="lineno">12489</span> }</div>
-<div class="line"><a name="l12490"></a><span class="lineno">12490</span>  </div>
-<div class="line"><a name="l12491"></a><span class="lineno">12491</span> <span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesCpu(</div>
-<div class="line"><a name="l12492"></a><span class="lineno">12492</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l12493"></a><span class="lineno">12493</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves)</div>
-<div class="line"><a name="l12494"></a><span class="lineno">12494</span> {</div>
-<div class="line"><a name="l12495"></a><span class="lineno">12495</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l12496"></a><span class="lineno">12496</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator->IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12497"></a><span class="lineno">12497</span>  </div>
-<div class="line"><a name="l12498"></a><span class="lineno">12498</span>  <span class="keyword">enum</span> BLOCK_FLAG</div>
-<div class="line"><a name="l12499"></a><span class="lineno">12499</span>  {</div>
-<div class="line"><a name="l12500"></a><span class="lineno">12500</span>  BLOCK_FLAG_USED = 0x00000001,</div>
-<div class="line"><a name="l12501"></a><span class="lineno">12501</span>  BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</div>
-<div class="line"><a name="l12502"></a><span class="lineno">12502</span>  };</div>
+<div class="line"><a name="l12488"></a><span class="lineno">12488</span>  m_Blocks.push_back(pBlock);</div>
+<div class="line"><a name="l12489"></a><span class="lineno">12489</span>  <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div>
+<div class="line"><a name="l12490"></a><span class="lineno">12490</span>  {</div>
+<div class="line"><a name="l12491"></a><span class="lineno">12491</span>  *pNewBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l12492"></a><span class="lineno">12492</span>  }</div>
+<div class="line"><a name="l12493"></a><span class="lineno">12493</span>  </div>
+<div class="line"><a name="l12494"></a><span class="lineno">12494</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12495"></a><span class="lineno">12495</span> }</div>
+<div class="line"><a name="l12496"></a><span class="lineno">12496</span>  </div>
+<div class="line"><a name="l12497"></a><span class="lineno">12497</span> <span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesCpu(</div>
+<div class="line"><a name="l12498"></a><span class="lineno">12498</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l12499"></a><span class="lineno">12499</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves)</div>
+<div class="line"><a name="l12500"></a><span class="lineno">12500</span> {</div>
+<div class="line"><a name="l12501"></a><span class="lineno">12501</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l12502"></a><span class="lineno">12502</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator->IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</div>
<div class="line"><a name="l12503"></a><span class="lineno">12503</span>  </div>
-<div class="line"><a name="l12504"></a><span class="lineno">12504</span>  <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l12504"></a><span class="lineno">12504</span>  <span class="keyword">enum</span> BLOCK_FLAG</div>
<div class="line"><a name="l12505"></a><span class="lineno">12505</span>  {</div>
-<div class="line"><a name="l12506"></a><span class="lineno">12506</span>  uint32_t flags;</div>
-<div class="line"><a name="l12507"></a><span class="lineno">12507</span>  <span class="keywordtype">void</span>* pMappedData;</div>
+<div class="line"><a name="l12506"></a><span class="lineno">12506</span>  BLOCK_FLAG_USED = 0x00000001,</div>
+<div class="line"><a name="l12507"></a><span class="lineno">12507</span>  BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</div>
<div class="line"><a name="l12508"></a><span class="lineno">12508</span>  };</div>
-<div class="line"><a name="l12509"></a><span class="lineno">12509</span>  VmaVector< BlockInfo, VmaStlAllocator<BlockInfo> ></div>
-<div class="line"><a name="l12510"></a><span class="lineno">12510</span>  blockInfo(blockCount, BlockInfo(), VmaStlAllocator<BlockInfo>(m_hAllocator->GetAllocationCallbacks()));</div>
-<div class="line"><a name="l12511"></a><span class="lineno">12511</span>  memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</div>
-<div class="line"><a name="l12512"></a><span class="lineno">12512</span>  </div>
-<div class="line"><a name="l12513"></a><span class="lineno">12513</span>  <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
-<div class="line"><a name="l12514"></a><span class="lineno">12514</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
-<div class="line"><a name="l12515"></a><span class="lineno">12515</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
-<div class="line"><a name="l12516"></a><span class="lineno">12516</span>  {</div>
-<div class="line"><a name="l12517"></a><span class="lineno">12517</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
-<div class="line"><a name="l12518"></a><span class="lineno">12518</span>  blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l12519"></a><span class="lineno">12519</span>  blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l12520"></a><span class="lineno">12520</span>  }</div>
-<div class="line"><a name="l12521"></a><span class="lineno">12521</span>  </div>
-<div class="line"><a name="l12522"></a><span class="lineno">12522</span>  VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);</div>
-<div class="line"><a name="l12523"></a><span class="lineno">12523</span>  </div>
-<div class="line"><a name="l12524"></a><span class="lineno">12524</span>  <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div>
-<div class="line"><a name="l12525"></a><span class="lineno">12525</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)</div>
-<div class="line"><a name="l12526"></a><span class="lineno">12526</span>  {</div>
-<div class="line"><a name="l12527"></a><span class="lineno">12527</span>  BlockInfo& currBlockInfo = blockInfo[blockIndex];</div>
-<div class="line"><a name="l12528"></a><span class="lineno">12528</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12529"></a><span class="lineno">12529</span>  <span class="keywordflow">if</span>((currBlockInfo.flags & BLOCK_FLAG_USED) != 0)</div>
-<div class="line"><a name="l12530"></a><span class="lineno">12530</span>  {</div>
-<div class="line"><a name="l12531"></a><span class="lineno">12531</span>  currBlockInfo.pMappedData = pBlock->GetMappedData();</div>
-<div class="line"><a name="l12532"></a><span class="lineno">12532</span>  <span class="comment">// It is not originally mapped - map it.</span></div>
-<div class="line"><a name="l12533"></a><span class="lineno">12533</span>  <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</div>
-<div class="line"><a name="l12534"></a><span class="lineno">12534</span>  {</div>
-<div class="line"><a name="l12535"></a><span class="lineno">12535</span>  pDefragCtx->res = pBlock->Map(m_hAllocator, 1, &currBlockInfo.pMappedData);</div>
-<div class="line"><a name="l12536"></a><span class="lineno">12536</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
-<div class="line"><a name="l12537"></a><span class="lineno">12537</span>  {</div>
-<div class="line"><a name="l12538"></a><span class="lineno">12538</span>  currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</div>
-<div class="line"><a name="l12539"></a><span class="lineno">12539</span>  }</div>
-<div class="line"><a name="l12540"></a><span class="lineno">12540</span>  }</div>
-<div class="line"><a name="l12541"></a><span class="lineno">12541</span>  }</div>
-<div class="line"><a name="l12542"></a><span class="lineno">12542</span>  }</div>
-<div class="line"><a name="l12543"></a><span class="lineno">12543</span>  </div>
-<div class="line"><a name="l12544"></a><span class="lineno">12544</span>  <span class="comment">// Go over all moves. Do actual data transfer.</span></div>
-<div class="line"><a name="l12545"></a><span class="lineno">12545</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
-<div class="line"><a name="l12546"></a><span class="lineno">12546</span>  {</div>
-<div class="line"><a name="l12547"></a><span class="lineno">12547</span>  <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator->m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
-<div class="line"><a name="l12548"></a><span class="lineno">12548</span>  VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
+<div class="line"><a name="l12509"></a><span class="lineno">12509</span>  </div>
+<div class="line"><a name="l12510"></a><span class="lineno">12510</span>  <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l12511"></a><span class="lineno">12511</span>  {</div>
+<div class="line"><a name="l12512"></a><span class="lineno">12512</span>  uint32_t flags;</div>
+<div class="line"><a name="l12513"></a><span class="lineno">12513</span>  <span class="keywordtype">void</span>* pMappedData;</div>
+<div class="line"><a name="l12514"></a><span class="lineno">12514</span>  };</div>
+<div class="line"><a name="l12515"></a><span class="lineno">12515</span>  VmaVector< BlockInfo, VmaStlAllocator<BlockInfo> ></div>
+<div class="line"><a name="l12516"></a><span class="lineno">12516</span>  blockInfo(blockCount, BlockInfo(), VmaStlAllocator<BlockInfo>(m_hAllocator->GetAllocationCallbacks()));</div>
+<div class="line"><a name="l12517"></a><span class="lineno">12517</span>  memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</div>
+<div class="line"><a name="l12518"></a><span class="lineno">12518</span>  </div>
+<div class="line"><a name="l12519"></a><span class="lineno">12519</span>  <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l12520"></a><span class="lineno">12520</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l12521"></a><span class="lineno">12521</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12522"></a><span class="lineno">12522</span>  {</div>
+<div class="line"><a name="l12523"></a><span class="lineno">12523</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
+<div class="line"><a name="l12524"></a><span class="lineno">12524</span>  blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12525"></a><span class="lineno">12525</span>  blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12526"></a><span class="lineno">12526</span>  }</div>
+<div class="line"><a name="l12527"></a><span class="lineno">12527</span>  </div>
+<div class="line"><a name="l12528"></a><span class="lineno">12528</span>  VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);</div>
+<div class="line"><a name="l12529"></a><span class="lineno">12529</span>  </div>
+<div class="line"><a name="l12530"></a><span class="lineno">12530</span>  <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div>
+<div class="line"><a name="l12531"></a><span class="lineno">12531</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l12532"></a><span class="lineno">12532</span>  {</div>
+<div class="line"><a name="l12533"></a><span class="lineno">12533</span>  BlockInfo& currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l12534"></a><span class="lineno">12534</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12535"></a><span class="lineno">12535</span>  <span class="keywordflow">if</span>((currBlockInfo.flags & BLOCK_FLAG_USED) != 0)</div>
+<div class="line"><a name="l12536"></a><span class="lineno">12536</span>  {</div>
+<div class="line"><a name="l12537"></a><span class="lineno">12537</span>  currBlockInfo.pMappedData = pBlock->GetMappedData();</div>
+<div class="line"><a name="l12538"></a><span class="lineno">12538</span>  <span class="comment">// It is not originally mapped - map it.</span></div>
+<div class="line"><a name="l12539"></a><span class="lineno">12539</span>  <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</div>
+<div class="line"><a name="l12540"></a><span class="lineno">12540</span>  {</div>
+<div class="line"><a name="l12541"></a><span class="lineno">12541</span>  pDefragCtx->res = pBlock->Map(m_hAllocator, 1, &currBlockInfo.pMappedData);</div>
+<div class="line"><a name="l12542"></a><span class="lineno">12542</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
+<div class="line"><a name="l12543"></a><span class="lineno">12543</span>  {</div>
+<div class="line"><a name="l12544"></a><span class="lineno">12544</span>  currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</div>
+<div class="line"><a name="l12545"></a><span class="lineno">12545</span>  }</div>
+<div class="line"><a name="l12546"></a><span class="lineno">12546</span>  }</div>
+<div class="line"><a name="l12547"></a><span class="lineno">12547</span>  }</div>
+<div class="line"><a name="l12548"></a><span class="lineno">12548</span>  }</div>
<div class="line"><a name="l12549"></a><span class="lineno">12549</span>  </div>
-<div class="line"><a name="l12550"></a><span class="lineno">12550</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
-<div class="line"><a name="l12551"></a><span class="lineno">12551</span>  {</div>
-<div class="line"><a name="l12552"></a><span class="lineno">12552</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
-<div class="line"><a name="l12553"></a><span class="lineno">12553</span>  </div>
-<div class="line"><a name="l12554"></a><span class="lineno">12554</span>  <span class="keyword">const</span> BlockInfo& srcBlockInfo = blockInfo[move.srcBlockIndex];</div>
-<div class="line"><a name="l12555"></a><span class="lineno">12555</span>  <span class="keyword">const</span> BlockInfo& dstBlockInfo = blockInfo[move.dstBlockIndex];</div>
-<div class="line"><a name="l12556"></a><span class="lineno">12556</span>  </div>
-<div class="line"><a name="l12557"></a><span class="lineno">12557</span>  VMA_ASSERT(srcBlockInfo.pMappedData && dstBlockInfo.pMappedData);</div>
-<div class="line"><a name="l12558"></a><span class="lineno">12558</span>  </div>
-<div class="line"><a name="l12559"></a><span class="lineno">12559</span>  <span class="comment">// Invalidate source.</span></div>
-<div class="line"><a name="l12560"></a><span class="lineno">12560</span>  <span class="keywordflow">if</span>(isNonCoherent)</div>
-<div class="line"><a name="l12561"></a><span class="lineno">12561</span>  {</div>
-<div class="line"><a name="l12562"></a><span class="lineno">12562</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div>
-<div class="line"><a name="l12563"></a><span class="lineno">12563</span>  memRange.memory = pSrcBlock->GetDeviceMemory();</div>
-<div class="line"><a name="l12564"></a><span class="lineno">12564</span>  memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l12565"></a><span class="lineno">12565</span>  memRange.size = VMA_MIN(</div>
-<div class="line"><a name="l12566"></a><span class="lineno">12566</span>  VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l12567"></a><span class="lineno">12567</span>  pSrcBlock->m_pMetadata->GetSize() - memRange.offset);</div>
-<div class="line"><a name="l12568"></a><span class="lineno">12568</span>  (*m_hAllocator->GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);</div>
-<div class="line"><a name="l12569"></a><span class="lineno">12569</span>  }</div>
-<div class="line"><a name="l12570"></a><span class="lineno">12570</span>  </div>
-<div class="line"><a name="l12571"></a><span class="lineno">12571</span>  <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div>
-<div class="line"><a name="l12572"></a><span class="lineno">12572</span>  memmove(</div>
-<div class="line"><a name="l12573"></a><span class="lineno">12573</span>  reinterpret_cast<char*>(dstBlockInfo.pMappedData) + move.dstOffset,</div>
-<div class="line"><a name="l12574"></a><span class="lineno">12574</span>  reinterpret_cast<char*>(srcBlockInfo.pMappedData) + move.srcOffset,</div>
-<div class="line"><a name="l12575"></a><span class="lineno">12575</span>  static_cast<size_t>(move.size));</div>
+<div class="line"><a name="l12550"></a><span class="lineno">12550</span>  <span class="comment">// Go over all moves. Do actual data transfer.</span></div>
+<div class="line"><a name="l12551"></a><span class="lineno">12551</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
+<div class="line"><a name="l12552"></a><span class="lineno">12552</span>  {</div>
+<div class="line"><a name="l12553"></a><span class="lineno">12553</span>  <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator->m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l12554"></a><span class="lineno">12554</span>  VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
+<div class="line"><a name="l12555"></a><span class="lineno">12555</span>  </div>
+<div class="line"><a name="l12556"></a><span class="lineno">12556</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12557"></a><span class="lineno">12557</span>  {</div>
+<div class="line"><a name="l12558"></a><span class="lineno">12558</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
+<div class="line"><a name="l12559"></a><span class="lineno">12559</span>  </div>
+<div class="line"><a name="l12560"></a><span class="lineno">12560</span>  <span class="keyword">const</span> BlockInfo& srcBlockInfo = blockInfo[move.srcBlockIndex];</div>
+<div class="line"><a name="l12561"></a><span class="lineno">12561</span>  <span class="keyword">const</span> BlockInfo& dstBlockInfo = blockInfo[move.dstBlockIndex];</div>
+<div class="line"><a name="l12562"></a><span class="lineno">12562</span>  </div>
+<div class="line"><a name="l12563"></a><span class="lineno">12563</span>  VMA_ASSERT(srcBlockInfo.pMappedData && dstBlockInfo.pMappedData);</div>
+<div class="line"><a name="l12564"></a><span class="lineno">12564</span>  </div>
+<div class="line"><a name="l12565"></a><span class="lineno">12565</span>  <span class="comment">// Invalidate source.</span></div>
+<div class="line"><a name="l12566"></a><span class="lineno">12566</span>  <span class="keywordflow">if</span>(isNonCoherent)</div>
+<div class="line"><a name="l12567"></a><span class="lineno">12567</span>  {</div>
+<div class="line"><a name="l12568"></a><span class="lineno">12568</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div>
+<div class="line"><a name="l12569"></a><span class="lineno">12569</span>  memRange.memory = pSrcBlock->GetDeviceMemory();</div>
+<div class="line"><a name="l12570"></a><span class="lineno">12570</span>  memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l12571"></a><span class="lineno">12571</span>  memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l12572"></a><span class="lineno">12572</span>  VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l12573"></a><span class="lineno">12573</span>  pSrcBlock->m_pMetadata->GetSize() - memRange.offset);</div>
+<div class="line"><a name="l12574"></a><span class="lineno">12574</span>  (*m_hAllocator->GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);</div>
+<div class="line"><a name="l12575"></a><span class="lineno">12575</span>  }</div>
<div class="line"><a name="l12576"></a><span class="lineno">12576</span>  </div>
-<div class="line"><a name="l12577"></a><span class="lineno">12577</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12578"></a><span class="lineno">12578</span>  {</div>
-<div class="line"><a name="l12579"></a><span class="lineno">12579</span>  VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l12580"></a><span class="lineno">12580</span>  VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div>
-<div class="line"><a name="l12581"></a><span class="lineno">12581</span>  }</div>
+<div class="line"><a name="l12577"></a><span class="lineno">12577</span>  <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div>
+<div class="line"><a name="l12578"></a><span class="lineno">12578</span>  memmove(</div>
+<div class="line"><a name="l12579"></a><span class="lineno">12579</span>  reinterpret_cast<char*>(dstBlockInfo.pMappedData) + move.dstOffset,</div>
+<div class="line"><a name="l12580"></a><span class="lineno">12580</span>  reinterpret_cast<char*>(srcBlockInfo.pMappedData) + move.srcOffset,</div>
+<div class="line"><a name="l12581"></a><span class="lineno">12581</span>  static_cast<size_t>(move.size));</div>
<div class="line"><a name="l12582"></a><span class="lineno">12582</span>  </div>
-<div class="line"><a name="l12583"></a><span class="lineno">12583</span>  <span class="comment">// Flush destination.</span></div>
-<div class="line"><a name="l12584"></a><span class="lineno">12584</span>  <span class="keywordflow">if</span>(isNonCoherent)</div>
-<div class="line"><a name="l12585"></a><span class="lineno">12585</span>  {</div>
-<div class="line"><a name="l12586"></a><span class="lineno">12586</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div>
-<div class="line"><a name="l12587"></a><span class="lineno">12587</span>  memRange.memory = pDstBlock->GetDeviceMemory();</div>
-<div class="line"><a name="l12588"></a><span class="lineno">12588</span>  memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l12589"></a><span class="lineno">12589</span>  memRange.size = VMA_MIN(</div>
-<div class="line"><a name="l12590"></a><span class="lineno">12590</span>  VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l12591"></a><span class="lineno">12591</span>  pDstBlock->m_pMetadata->GetSize() - memRange.offset);</div>
-<div class="line"><a name="l12592"></a><span class="lineno">12592</span>  (*m_hAllocator->GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);</div>
-<div class="line"><a name="l12593"></a><span class="lineno">12593</span>  }</div>
-<div class="line"><a name="l12594"></a><span class="lineno">12594</span>  }</div>
-<div class="line"><a name="l12595"></a><span class="lineno">12595</span>  }</div>
-<div class="line"><a name="l12596"></a><span class="lineno">12596</span>  </div>
-<div class="line"><a name="l12597"></a><span class="lineno">12597</span>  <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="l12598"></a><span class="lineno">12598</span>  <span class="comment">// Regardless of pCtx->res == VK_SUCCESS.</span></div>
-<div class="line"><a name="l12599"></a><span class="lineno">12599</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</div>
-<div class="line"><a name="l12600"></a><span class="lineno">12600</span>  {</div>
-<div class="line"><a name="l12601"></a><span class="lineno">12601</span>  <span class="keyword">const</span> BlockInfo& currBlockInfo = blockInfo[blockIndex];</div>
-<div class="line"><a name="l12602"></a><span class="lineno">12602</span>  <span class="keywordflow">if</span>((currBlockInfo.flags & BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div>
-<div class="line"><a name="l12603"></a><span class="lineno">12603</span>  {</div>
-<div class="line"><a name="l12604"></a><span class="lineno">12604</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12605"></a><span class="lineno">12605</span>  pBlock->Unmap(m_hAllocator, 1);</div>
-<div class="line"><a name="l12606"></a><span class="lineno">12606</span>  }</div>
-<div class="line"><a name="l12607"></a><span class="lineno">12607</span>  }</div>
-<div class="line"><a name="l12608"></a><span class="lineno">12608</span> }</div>
-<div class="line"><a name="l12609"></a><span class="lineno">12609</span>  </div>
-<div class="line"><a name="l12610"></a><span class="lineno">12610</span> <span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div>
-<div class="line"><a name="l12611"></a><span class="lineno">12611</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l12612"></a><span class="lineno">12612</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
-<div class="line"><a name="l12613"></a><span class="lineno">12613</span>  VkCommandBuffer commandBuffer)</div>
-<div class="line"><a name="l12614"></a><span class="lineno">12614</span> {</div>
-<div class="line"><a name="l12615"></a><span class="lineno">12615</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l12616"></a><span class="lineno">12616</span>  </div>
-<div class="line"><a name="l12617"></a><span class="lineno">12617</span>  pDefragCtx->blockContexts.resize(blockCount);</div>
-<div class="line"><a name="l12618"></a><span class="lineno">12618</span>  memset(pDefragCtx->blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div>
-<div class="line"><a name="l12619"></a><span class="lineno">12619</span>  </div>
-<div class="line"><a name="l12620"></a><span class="lineno">12620</span>  <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
-<div class="line"><a name="l12621"></a><span class="lineno">12621</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
-<div class="line"><a name="l12622"></a><span class="lineno">12622</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
-<div class="line"><a name="l12623"></a><span class="lineno">12623</span>  {</div>
-<div class="line"><a name="l12624"></a><span class="lineno">12624</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
-<div class="line"><a name="l12625"></a><span class="lineno">12625</span>  pDefragCtx->blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l12626"></a><span class="lineno">12626</span>  pDefragCtx->blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l12627"></a><span class="lineno">12627</span>  }</div>
-<div class="line"><a name="l12628"></a><span class="lineno">12628</span>  </div>
-<div class="line"><a name="l12629"></a><span class="lineno">12629</span>  VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);</div>
-<div class="line"><a name="l12630"></a><span class="lineno">12630</span>  </div>
-<div class="line"><a name="l12631"></a><span class="lineno">12631</span>  <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div>
-<div class="line"><a name="l12632"></a><span class="lineno">12632</span>  {</div>
-<div class="line"><a name="l12633"></a><span class="lineno">12633</span>  VkBufferCreateInfo bufCreateInfo;</div>
-<div class="line"><a name="l12634"></a><span class="lineno">12634</span>  VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</div>
-<div class="line"><a name="l12635"></a><span class="lineno">12635</span>  </div>
-<div class="line"><a name="l12636"></a><span class="lineno">12636</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)</div>
-<div class="line"><a name="l12637"></a><span class="lineno">12637</span>  {</div>
-<div class="line"><a name="l12638"></a><span class="lineno">12638</span>  VmaBlockDefragmentationContext& currBlockCtx = pDefragCtx->blockContexts[blockIndex];</div>
-<div class="line"><a name="l12639"></a><span class="lineno">12639</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12640"></a><span class="lineno">12640</span>  <span class="keywordflow">if</span>((currBlockCtx.flags & VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)</div>
-<div class="line"><a name="l12641"></a><span class="lineno">12641</span>  {</div>
-<div class="line"><a name="l12642"></a><span class="lineno">12642</span>  bufCreateInfo.size = pBlock->m_pMetadata->GetSize();</div>
-<div class="line"><a name="l12643"></a><span class="lineno">12643</span>  pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l12644"></a><span class="lineno">12644</span>  m_hAllocator->m_hDevice, &bufCreateInfo, m_hAllocator->GetAllocationCallbacks(), &currBlockCtx.hBuffer);</div>
-<div class="line"><a name="l12645"></a><span class="lineno">12645</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
-<div class="line"><a name="l12646"></a><span class="lineno">12646</span>  {</div>
-<div class="line"><a name="l12647"></a><span class="lineno">12647</span>  pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkBindBufferMemory)(</div>
-<div class="line"><a name="l12648"></a><span class="lineno">12648</span>  m_hAllocator->m_hDevice, currBlockCtx.hBuffer, pBlock->GetDeviceMemory(), 0);</div>
-<div class="line"><a name="l12649"></a><span class="lineno">12649</span>  }</div>
-<div class="line"><a name="l12650"></a><span class="lineno">12650</span>  }</div>
-<div class="line"><a name="l12651"></a><span class="lineno">12651</span>  }</div>
-<div class="line"><a name="l12652"></a><span class="lineno">12652</span>  }</div>
-<div class="line"><a name="l12653"></a><span class="lineno">12653</span>  </div>
-<div class="line"><a name="l12654"></a><span class="lineno">12654</span>  <span class="comment">// Go over all moves. Post data transfer commands to command buffer.</span></div>
-<div class="line"><a name="l12655"></a><span class="lineno">12655</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
-<div class="line"><a name="l12656"></a><span class="lineno">12656</span>  {</div>
-<div class="line"><a name="l12657"></a><span class="lineno">12657</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
-<div class="line"><a name="l12658"></a><span class="lineno">12658</span>  {</div>
-<div class="line"><a name="l12659"></a><span class="lineno">12659</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
-<div class="line"><a name="l12660"></a><span class="lineno">12660</span>  </div>
-<div class="line"><a name="l12661"></a><span class="lineno">12661</span>  <span class="keyword">const</span> VmaBlockDefragmentationContext& srcBlockCtx = pDefragCtx->blockContexts[move.srcBlockIndex];</div>
-<div class="line"><a name="l12662"></a><span class="lineno">12662</span>  <span class="keyword">const</span> VmaBlockDefragmentationContext& dstBlockCtx = pDefragCtx->blockContexts[move.dstBlockIndex];</div>
-<div class="line"><a name="l12663"></a><span class="lineno">12663</span>  </div>
-<div class="line"><a name="l12664"></a><span class="lineno">12664</span>  VMA_ASSERT(srcBlockCtx.hBuffer && dstBlockCtx.hBuffer);</div>
-<div class="line"><a name="l12665"></a><span class="lineno">12665</span>  </div>
-<div class="line"><a name="l12666"></a><span class="lineno">12666</span>  VkBufferCopy region = {</div>
-<div class="line"><a name="l12667"></a><span class="lineno">12667</span>  move.srcOffset,</div>
-<div class="line"><a name="l12668"></a><span class="lineno">12668</span>  move.dstOffset,</div>
-<div class="line"><a name="l12669"></a><span class="lineno">12669</span>  move.size };</div>
-<div class="line"><a name="l12670"></a><span class="lineno">12670</span>  (*m_hAllocator->GetVulkanFunctions().vkCmdCopyBuffer)(</div>
-<div class="line"><a name="l12671"></a><span class="lineno">12671</span>  commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &region);</div>
-<div class="line"><a name="l12672"></a><span class="lineno">12672</span>  }</div>
-<div class="line"><a name="l12673"></a><span class="lineno">12673</span>  }</div>
-<div class="line"><a name="l12674"></a><span class="lineno">12674</span>  </div>
-<div class="line"><a name="l12675"></a><span class="lineno">12675</span>  <span class="comment">// Save buffers to defrag context for later destruction.</span></div>
-<div class="line"><a name="l12676"></a><span class="lineno">12676</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS && moveCount > 0)</div>
-<div class="line"><a name="l12677"></a><span class="lineno">12677</span>  {</div>
-<div class="line"><a name="l12678"></a><span class="lineno">12678</span>  pDefragCtx->res = VK_NOT_READY;</div>
+<div class="line"><a name="l12583"></a><span class="lineno">12583</span>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l12584"></a><span class="lineno">12584</span>  {</div>
+<div class="line"><a name="l12585"></a><span class="lineno">12585</span>  VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l12586"></a><span class="lineno">12586</span>  VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div>
+<div class="line"><a name="l12587"></a><span class="lineno">12587</span>  }</div>
+<div class="line"><a name="l12588"></a><span class="lineno">12588</span>  </div>
+<div class="line"><a name="l12589"></a><span class="lineno">12589</span>  <span class="comment">// Flush destination.</span></div>
+<div class="line"><a name="l12590"></a><span class="lineno">12590</span>  <span class="keywordflow">if</span>(isNonCoherent)</div>
+<div class="line"><a name="l12591"></a><span class="lineno">12591</span>  {</div>
+<div class="line"><a name="l12592"></a><span class="lineno">12592</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div>
+<div class="line"><a name="l12593"></a><span class="lineno">12593</span>  memRange.memory = pDstBlock->GetDeviceMemory();</div>
+<div class="line"><a name="l12594"></a><span class="lineno">12594</span>  memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l12595"></a><span class="lineno">12595</span>  memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l12596"></a><span class="lineno">12596</span>  VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l12597"></a><span class="lineno">12597</span>  pDstBlock->m_pMetadata->GetSize() - memRange.offset);</div>
+<div class="line"><a name="l12598"></a><span class="lineno">12598</span>  (*m_hAllocator->GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);</div>
+<div class="line"><a name="l12599"></a><span class="lineno">12599</span>  }</div>
+<div class="line"><a name="l12600"></a><span class="lineno">12600</span>  }</div>
+<div class="line"><a name="l12601"></a><span class="lineno">12601</span>  }</div>
+<div class="line"><a name="l12602"></a><span class="lineno">12602</span>  </div>
+<div class="line"><a name="l12603"></a><span class="lineno">12603</span>  <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="l12604"></a><span class="lineno">12604</span>  <span class="comment">// Regardless of pCtx->res == VK_SUCCESS.</span></div>
+<div class="line"><a name="l12605"></a><span class="lineno">12605</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</div>
+<div class="line"><a name="l12606"></a><span class="lineno">12606</span>  {</div>
+<div class="line"><a name="l12607"></a><span class="lineno">12607</span>  <span class="keyword">const</span> BlockInfo& currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l12608"></a><span class="lineno">12608</span>  <span class="keywordflow">if</span>((currBlockInfo.flags & BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div>
+<div class="line"><a name="l12609"></a><span class="lineno">12609</span>  {</div>
+<div class="line"><a name="l12610"></a><span class="lineno">12610</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12611"></a><span class="lineno">12611</span>  pBlock->Unmap(m_hAllocator, 1);</div>
+<div class="line"><a name="l12612"></a><span class="lineno">12612</span>  }</div>
+<div class="line"><a name="l12613"></a><span class="lineno">12613</span>  }</div>
+<div class="line"><a name="l12614"></a><span class="lineno">12614</span> }</div>
+<div class="line"><a name="l12615"></a><span class="lineno">12615</span>  </div>
+<div class="line"><a name="l12616"></a><span class="lineno">12616</span> <span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div>
+<div class="line"><a name="l12617"></a><span class="lineno">12617</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l12618"></a><span class="lineno">12618</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
+<div class="line"><a name="l12619"></a><span class="lineno">12619</span>  VkCommandBuffer commandBuffer)</div>
+<div class="line"><a name="l12620"></a><span class="lineno">12620</span> {</div>
+<div class="line"><a name="l12621"></a><span class="lineno">12621</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l12622"></a><span class="lineno">12622</span>  </div>
+<div class="line"><a name="l12623"></a><span class="lineno">12623</span>  pDefragCtx->blockContexts.resize(blockCount);</div>
+<div class="line"><a name="l12624"></a><span class="lineno">12624</span>  memset(pDefragCtx->blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div>
+<div class="line"><a name="l12625"></a><span class="lineno">12625</span>  </div>
+<div class="line"><a name="l12626"></a><span class="lineno">12626</span>  <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l12627"></a><span class="lineno">12627</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l12628"></a><span class="lineno">12628</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12629"></a><span class="lineno">12629</span>  {</div>
+<div class="line"><a name="l12630"></a><span class="lineno">12630</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
+<div class="line"><a name="l12631"></a><span class="lineno">12631</span>  pDefragCtx->blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12632"></a><span class="lineno">12632</span>  pDefragCtx->blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l12633"></a><span class="lineno">12633</span>  }</div>
+<div class="line"><a name="l12634"></a><span class="lineno">12634</span>  </div>
+<div class="line"><a name="l12635"></a><span class="lineno">12635</span>  VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);</div>
+<div class="line"><a name="l12636"></a><span class="lineno">12636</span>  </div>
+<div class="line"><a name="l12637"></a><span class="lineno">12637</span>  <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div>
+<div class="line"><a name="l12638"></a><span class="lineno">12638</span>  {</div>
+<div class="line"><a name="l12639"></a><span class="lineno">12639</span>  VkBufferCreateInfo bufCreateInfo;</div>
+<div class="line"><a name="l12640"></a><span class="lineno">12640</span>  VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</div>
+<div class="line"><a name="l12641"></a><span class="lineno">12641</span>  </div>
+<div class="line"><a name="l12642"></a><span class="lineno">12642</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l12643"></a><span class="lineno">12643</span>  {</div>
+<div class="line"><a name="l12644"></a><span class="lineno">12644</span>  VmaBlockDefragmentationContext& currBlockCtx = pDefragCtx->blockContexts[blockIndex];</div>
+<div class="line"><a name="l12645"></a><span class="lineno">12645</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12646"></a><span class="lineno">12646</span>  <span class="keywordflow">if</span>((currBlockCtx.flags & VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)</div>
+<div class="line"><a name="l12647"></a><span class="lineno">12647</span>  {</div>
+<div class="line"><a name="l12648"></a><span class="lineno">12648</span>  bufCreateInfo.size = pBlock->m_pMetadata->GetSize();</div>
+<div class="line"><a name="l12649"></a><span class="lineno">12649</span>  pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l12650"></a><span class="lineno">12650</span>  m_hAllocator->m_hDevice, &bufCreateInfo, m_hAllocator->GetAllocationCallbacks(), &currBlockCtx.hBuffer);</div>
+<div class="line"><a name="l12651"></a><span class="lineno">12651</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
+<div class="line"><a name="l12652"></a><span class="lineno">12652</span>  {</div>
+<div class="line"><a name="l12653"></a><span class="lineno">12653</span>  pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkBindBufferMemory)(</div>
+<div class="line"><a name="l12654"></a><span class="lineno">12654</span>  m_hAllocator->m_hDevice, currBlockCtx.hBuffer, pBlock->GetDeviceMemory(), 0);</div>
+<div class="line"><a name="l12655"></a><span class="lineno">12655</span>  }</div>
+<div class="line"><a name="l12656"></a><span class="lineno">12656</span>  }</div>
+<div class="line"><a name="l12657"></a><span class="lineno">12657</span>  }</div>
+<div class="line"><a name="l12658"></a><span class="lineno">12658</span>  }</div>
+<div class="line"><a name="l12659"></a><span class="lineno">12659</span>  </div>
+<div class="line"><a name="l12660"></a><span class="lineno">12660</span>  <span class="comment">// Go over all moves. Post data transfer commands to command buffer.</span></div>
+<div class="line"><a name="l12661"></a><span class="lineno">12661</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS)</div>
+<div class="line"><a name="l12662"></a><span class="lineno">12662</span>  {</div>
+<div class="line"><a name="l12663"></a><span class="lineno">12663</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex < moveCount; ++moveIndex)</div>
+<div class="line"><a name="l12664"></a><span class="lineno">12664</span>  {</div>
+<div class="line"><a name="l12665"></a><span class="lineno">12665</span>  <span class="keyword">const</span> VmaDefragmentationMove& move = moves[moveIndex];</div>
+<div class="line"><a name="l12666"></a><span class="lineno">12666</span>  </div>
+<div class="line"><a name="l12667"></a><span class="lineno">12667</span>  <span class="keyword">const</span> VmaBlockDefragmentationContext& srcBlockCtx = pDefragCtx->blockContexts[move.srcBlockIndex];</div>
+<div class="line"><a name="l12668"></a><span class="lineno">12668</span>  <span class="keyword">const</span> VmaBlockDefragmentationContext& dstBlockCtx = pDefragCtx->blockContexts[move.dstBlockIndex];</div>
+<div class="line"><a name="l12669"></a><span class="lineno">12669</span>  </div>
+<div class="line"><a name="l12670"></a><span class="lineno">12670</span>  VMA_ASSERT(srcBlockCtx.hBuffer && dstBlockCtx.hBuffer);</div>
+<div class="line"><a name="l12671"></a><span class="lineno">12671</span>  </div>
+<div class="line"><a name="l12672"></a><span class="lineno">12672</span>  VkBufferCopy region = {</div>
+<div class="line"><a name="l12673"></a><span class="lineno">12673</span>  move.srcOffset,</div>
+<div class="line"><a name="l12674"></a><span class="lineno">12674</span>  move.dstOffset,</div>
+<div class="line"><a name="l12675"></a><span class="lineno">12675</span>  move.size };</div>
+<div class="line"><a name="l12676"></a><span class="lineno">12676</span>  (*m_hAllocator->GetVulkanFunctions().vkCmdCopyBuffer)(</div>
+<div class="line"><a name="l12677"></a><span class="lineno">12677</span>  commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &region);</div>
+<div class="line"><a name="l12678"></a><span class="lineno">12678</span>  }</div>
<div class="line"><a name="l12679"></a><span class="lineno">12679</span>  }</div>
-<div class="line"><a name="l12680"></a><span class="lineno">12680</span> }</div>
-<div class="line"><a name="l12681"></a><span class="lineno">12681</span>  </div>
-<div class="line"><a name="l12682"></a><span class="lineno">12682</span> <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="l12683"></a><span class="lineno">12683</span> {</div>
-<div class="line"><a name="l12684"></a><span class="lineno">12684</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l12685"></a><span class="lineno">12685</span>  {</div>
-<div class="line"><a name="l12686"></a><span class="lineno">12686</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12687"></a><span class="lineno">12687</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
-<div class="line"><a name="l12688"></a><span class="lineno">12688</span>  {</div>
-<div class="line"><a name="l12689"></a><span class="lineno">12689</span>  <span class="keywordflow">if</span>(m_Blocks.size() > m_MinBlockCount)</div>
-<div class="line"><a name="l12690"></a><span class="lineno">12690</span>  {</div>
-<div class="line"><a name="l12691"></a><span class="lineno">12691</span>  <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div>
-<div class="line"><a name="l12692"></a><span class="lineno">12692</span>  {</div>
-<div class="line"><a name="l12693"></a><span class="lineno">12693</span>  ++pDefragmentationStats-><a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
-<div class="line"><a name="l12694"></a><span class="lineno">12694</span>  pDefragmentationStats-><a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock->m_pMetadata->GetSize();</div>
-<div class="line"><a name="l12695"></a><span class="lineno">12695</span>  }</div>
-<div class="line"><a name="l12696"></a><span class="lineno">12696</span>  </div>
-<div class="line"><a name="l12697"></a><span class="lineno">12697</span>  VmaVectorRemove(m_Blocks, blockIndex);</div>
-<div class="line"><a name="l12698"></a><span class="lineno">12698</span>  pBlock->Destroy(m_hAllocator);</div>
-<div class="line"><a name="l12699"></a><span class="lineno">12699</span>  vma_delete(m_hAllocator, pBlock);</div>
-<div class="line"><a name="l12700"></a><span class="lineno">12700</span>  }</div>
-<div class="line"><a name="l12701"></a><span class="lineno">12701</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12702"></a><span class="lineno">12702</span>  {</div>
-<div class="line"><a name="l12703"></a><span class="lineno">12703</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12704"></a><span class="lineno">12704</span>  }</div>
-<div class="line"><a name="l12705"></a><span class="lineno">12705</span>  }</div>
-<div class="line"><a name="l12706"></a><span class="lineno">12706</span>  }</div>
-<div class="line"><a name="l12707"></a><span class="lineno">12707</span>  UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12708"></a><span class="lineno">12708</span> }</div>
-<div class="line"><a name="l12709"></a><span class="lineno">12709</span>  </div>
-<div class="line"><a name="l12710"></a><span class="lineno">12710</span> <span class="keywordtype">void</span> VmaBlockVector::UpdateHasEmptyBlock()</div>
-<div class="line"><a name="l12711"></a><span class="lineno">12711</span> {</div>
-<div class="line"><a name="l12712"></a><span class="lineno">12712</span>  m_HasEmptyBlock = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12713"></a><span class="lineno">12713</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = 0, count = m_Blocks.size(); index < count; ++index)</div>
-<div class="line"><a name="l12714"></a><span class="lineno">12714</span>  {</div>
-<div class="line"><a name="l12715"></a><span class="lineno">12715</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[index];</div>
-<div class="line"><a name="l12716"></a><span class="lineno">12716</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
-<div class="line"><a name="l12717"></a><span class="lineno">12717</span>  {</div>
-<div class="line"><a name="l12718"></a><span class="lineno">12718</span>  m_HasEmptyBlock = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l12719"></a><span class="lineno">12719</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12720"></a><span class="lineno">12720</span>  }</div>
-<div class="line"><a name="l12721"></a><span class="lineno">12721</span>  }</div>
-<div class="line"><a name="l12722"></a><span class="lineno">12722</span> }</div>
-<div class="line"><a name="l12723"></a><span class="lineno">12723</span>  </div>
-<div class="line"><a name="l12724"></a><span class="lineno">12724</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12725"></a><span class="lineno">12725</span>  </div>
-<div class="line"><a name="l12726"></a><span class="lineno">12726</span> <span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)</div>
-<div class="line"><a name="l12727"></a><span class="lineno">12727</span> {</div>
-<div class="line"><a name="l12728"></a><span class="lineno">12728</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12680"></a><span class="lineno">12680</span>  </div>
+<div class="line"><a name="l12681"></a><span class="lineno">12681</span>  <span class="comment">// Save buffers to defrag context for later destruction.</span></div>
+<div class="line"><a name="l12682"></a><span class="lineno">12682</span>  <span class="keywordflow">if</span>(pDefragCtx->res == VK_SUCCESS && moveCount > 0)</div>
+<div class="line"><a name="l12683"></a><span class="lineno">12683</span>  {</div>
+<div class="line"><a name="l12684"></a><span class="lineno">12684</span>  pDefragCtx->res = VK_NOT_READY;</div>
+<div class="line"><a name="l12685"></a><span class="lineno">12685</span>  }</div>
+<div class="line"><a name="l12686"></a><span class="lineno">12686</span> }</div>
+<div class="line"><a name="l12687"></a><span class="lineno">12687</span>  </div>
+<div class="line"><a name="l12688"></a><span class="lineno">12688</span> <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="l12689"></a><span class="lineno">12689</span> {</div>
+<div class="line"><a name="l12690"></a><span class="lineno">12690</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l12691"></a><span class="lineno">12691</span>  {</div>
+<div class="line"><a name="l12692"></a><span class="lineno">12692</span>  VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12693"></a><span class="lineno">12693</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
+<div class="line"><a name="l12694"></a><span class="lineno">12694</span>  {</div>
+<div class="line"><a name="l12695"></a><span class="lineno">12695</span>  <span class="keywordflow">if</span>(m_Blocks.size() > m_MinBlockCount)</div>
+<div class="line"><a name="l12696"></a><span class="lineno">12696</span>  {</div>
+<div class="line"><a name="l12697"></a><span class="lineno">12697</span>  <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div>
+<div class="line"><a name="l12698"></a><span class="lineno">12698</span>  {</div>
+<div class="line"><a name="l12699"></a><span class="lineno">12699</span>  ++pDefragmentationStats-><a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
+<div class="line"><a name="l12700"></a><span class="lineno">12700</span>  pDefragmentationStats-><a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock->m_pMetadata->GetSize();</div>
+<div class="line"><a name="l12701"></a><span class="lineno">12701</span>  }</div>
+<div class="line"><a name="l12702"></a><span class="lineno">12702</span>  </div>
+<div class="line"><a name="l12703"></a><span class="lineno">12703</span>  VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l12704"></a><span class="lineno">12704</span>  pBlock->Destroy(m_hAllocator);</div>
+<div class="line"><a name="l12705"></a><span class="lineno">12705</span>  vma_delete(m_hAllocator, pBlock);</div>
+<div class="line"><a name="l12706"></a><span class="lineno">12706</span>  }</div>
+<div class="line"><a name="l12707"></a><span class="lineno">12707</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12708"></a><span class="lineno">12708</span>  {</div>
+<div class="line"><a name="l12709"></a><span class="lineno">12709</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12710"></a><span class="lineno">12710</span>  }</div>
+<div class="line"><a name="l12711"></a><span class="lineno">12711</span>  }</div>
+<div class="line"><a name="l12712"></a><span class="lineno">12712</span>  }</div>
+<div class="line"><a name="l12713"></a><span class="lineno">12713</span>  UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l12714"></a><span class="lineno">12714</span> }</div>
+<div class="line"><a name="l12715"></a><span class="lineno">12715</span>  </div>
+<div class="line"><a name="l12716"></a><span class="lineno">12716</span> <span class="keywordtype">void</span> VmaBlockVector::UpdateHasEmptyBlock()</div>
+<div class="line"><a name="l12717"></a><span class="lineno">12717</span> {</div>
+<div class="line"><a name="l12718"></a><span class="lineno">12718</span>  m_HasEmptyBlock = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12719"></a><span class="lineno">12719</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = 0, count = m_Blocks.size(); index < count; ++index)</div>
+<div class="line"><a name="l12720"></a><span class="lineno">12720</span>  {</div>
+<div class="line"><a name="l12721"></a><span class="lineno">12721</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[index];</div>
+<div class="line"><a name="l12722"></a><span class="lineno">12722</span>  <span class="keywordflow">if</span>(pBlock->m_pMetadata->IsEmpty())</div>
+<div class="line"><a name="l12723"></a><span class="lineno">12723</span>  {</div>
+<div class="line"><a name="l12724"></a><span class="lineno">12724</span>  m_HasEmptyBlock = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12725"></a><span class="lineno">12725</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12726"></a><span class="lineno">12726</span>  }</div>
+<div class="line"><a name="l12727"></a><span class="lineno">12727</span>  }</div>
+<div class="line"><a name="l12728"></a><span class="lineno">12728</span> }</div>
<div class="line"><a name="l12729"></a><span class="lineno">12729</span>  </div>
-<div class="line"><a name="l12730"></a><span class="lineno">12730</span>  json.BeginObject();</div>
+<div class="line"><a name="l12730"></a><span class="lineno">12730</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
<div class="line"><a name="l12731"></a><span class="lineno">12731</span>  </div>
-<div class="line"><a name="l12732"></a><span class="lineno">12732</span>  <span class="keywordflow">if</span>(IsCustomPool())</div>
-<div class="line"><a name="l12733"></a><span class="lineno">12733</span>  {</div>
-<div class="line"><a name="l12734"></a><span class="lineno">12734</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* poolName = m_hParentPool->GetName();</div>
-<div class="line"><a name="l12735"></a><span class="lineno">12735</span>  <span class="keywordflow">if</span>(poolName != VMA_NULL && poolName[0] != <span class="charliteral">'\0'</span>)</div>
-<div class="line"><a name="l12736"></a><span class="lineno">12736</span>  {</div>
-<div class="line"><a name="l12737"></a><span class="lineno">12737</span>  json.WriteString(<span class="stringliteral">"Name"</span>);</div>
-<div class="line"><a name="l12738"></a><span class="lineno">12738</span>  json.WriteString(poolName);</div>
-<div class="line"><a name="l12739"></a><span class="lineno">12739</span>  }</div>
-<div class="line"><a name="l12740"></a><span class="lineno">12740</span>  </div>
-<div class="line"><a name="l12741"></a><span class="lineno">12741</span>  json.WriteString(<span class="stringliteral">"MemoryTypeIndex"</span>);</div>
-<div class="line"><a name="l12742"></a><span class="lineno">12742</span>  json.WriteNumber(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12743"></a><span class="lineno">12743</span>  </div>
-<div class="line"><a name="l12744"></a><span class="lineno">12744</span>  json.WriteString(<span class="stringliteral">"BlockSize"</span>);</div>
-<div class="line"><a name="l12745"></a><span class="lineno">12745</span>  json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l12732"></a><span class="lineno">12732</span> <span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)</div>
+<div class="line"><a name="l12733"></a><span class="lineno">12733</span> {</div>
+<div class="line"><a name="l12734"></a><span class="lineno">12734</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12735"></a><span class="lineno">12735</span>  </div>
+<div class="line"><a name="l12736"></a><span class="lineno">12736</span>  json.BeginObject();</div>
+<div class="line"><a name="l12737"></a><span class="lineno">12737</span>  </div>
+<div class="line"><a name="l12738"></a><span class="lineno">12738</span>  <span class="keywordflow">if</span>(IsCustomPool())</div>
+<div class="line"><a name="l12739"></a><span class="lineno">12739</span>  {</div>
+<div class="line"><a name="l12740"></a><span class="lineno">12740</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* poolName = m_hParentPool->GetName();</div>
+<div class="line"><a name="l12741"></a><span class="lineno">12741</span>  <span class="keywordflow">if</span>(poolName != VMA_NULL && poolName[0] != <span class="charliteral">'\0'</span>)</div>
+<div class="line"><a name="l12742"></a><span class="lineno">12742</span>  {</div>
+<div class="line"><a name="l12743"></a><span class="lineno">12743</span>  json.WriteString(<span class="stringliteral">"Name"</span>);</div>
+<div class="line"><a name="l12744"></a><span class="lineno">12744</span>  json.WriteString(poolName);</div>
+<div class="line"><a name="l12745"></a><span class="lineno">12745</span>  }</div>
<div class="line"><a name="l12746"></a><span class="lineno">12746</span>  </div>
-<div class="line"><a name="l12747"></a><span class="lineno">12747</span>  json.WriteString(<span class="stringliteral">"BlockCount"</span>);</div>
-<div class="line"><a name="l12748"></a><span class="lineno">12748</span>  json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l12749"></a><span class="lineno">12749</span>  <span class="keywordflow">if</span>(m_MinBlockCount > 0)</div>
-<div class="line"><a name="l12750"></a><span class="lineno">12750</span>  {</div>
-<div class="line"><a name="l12751"></a><span class="lineno">12751</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div>
-<div class="line"><a name="l12752"></a><span class="lineno">12752</span>  json.WriteNumber((uint64_t)m_MinBlockCount);</div>
-<div class="line"><a name="l12753"></a><span class="lineno">12753</span>  }</div>
-<div class="line"><a name="l12754"></a><span class="lineno">12754</span>  <span class="keywordflow">if</span>(m_MaxBlockCount < SIZE_MAX)</div>
-<div class="line"><a name="l12755"></a><span class="lineno">12755</span>  {</div>
-<div class="line"><a name="l12756"></a><span class="lineno">12756</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div>
-<div class="line"><a name="l12757"></a><span class="lineno">12757</span>  json.WriteNumber((uint64_t)m_MaxBlockCount);</div>
-<div class="line"><a name="l12758"></a><span class="lineno">12758</span>  }</div>
-<div class="line"><a name="l12759"></a><span class="lineno">12759</span>  json.WriteString(<span class="stringliteral">"Cur"</span>);</div>
-<div class="line"><a name="l12760"></a><span class="lineno">12760</span>  json.WriteNumber((uint64_t)m_Blocks.size());</div>
-<div class="line"><a name="l12761"></a><span class="lineno">12761</span>  json.EndObject();</div>
-<div class="line"><a name="l12762"></a><span class="lineno">12762</span>  </div>
-<div class="line"><a name="l12763"></a><span class="lineno">12763</span>  <span class="keywordflow">if</span>(m_FrameInUseCount > 0)</div>
-<div class="line"><a name="l12764"></a><span class="lineno">12764</span>  {</div>
-<div class="line"><a name="l12765"></a><span class="lineno">12765</span>  json.WriteString(<span class="stringliteral">"FrameInUseCount"</span>);</div>
-<div class="line"><a name="l12766"></a><span class="lineno">12766</span>  json.WriteNumber(m_FrameInUseCount);</div>
-<div class="line"><a name="l12767"></a><span class="lineno">12767</span>  }</div>
+<div class="line"><a name="l12747"></a><span class="lineno">12747</span>  json.WriteString(<span class="stringliteral">"MemoryTypeIndex"</span>);</div>
+<div class="line"><a name="l12748"></a><span class="lineno">12748</span>  json.WriteNumber(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l12749"></a><span class="lineno">12749</span>  </div>
+<div class="line"><a name="l12750"></a><span class="lineno">12750</span>  json.WriteString(<span class="stringliteral">"BlockSize"</span>);</div>
+<div class="line"><a name="l12751"></a><span class="lineno">12751</span>  json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l12752"></a><span class="lineno">12752</span>  </div>
+<div class="line"><a name="l12753"></a><span class="lineno">12753</span>  json.WriteString(<span class="stringliteral">"BlockCount"</span>);</div>
+<div class="line"><a name="l12754"></a><span class="lineno">12754</span>  json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l12755"></a><span class="lineno">12755</span>  <span class="keywordflow">if</span>(m_MinBlockCount > 0)</div>
+<div class="line"><a name="l12756"></a><span class="lineno">12756</span>  {</div>
+<div class="line"><a name="l12757"></a><span class="lineno">12757</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div>
+<div class="line"><a name="l12758"></a><span class="lineno">12758</span>  json.WriteNumber((uint64_t)m_MinBlockCount);</div>
+<div class="line"><a name="l12759"></a><span class="lineno">12759</span>  }</div>
+<div class="line"><a name="l12760"></a><span class="lineno">12760</span>  <span class="keywordflow">if</span>(m_MaxBlockCount < SIZE_MAX)</div>
+<div class="line"><a name="l12761"></a><span class="lineno">12761</span>  {</div>
+<div class="line"><a name="l12762"></a><span class="lineno">12762</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div>
+<div class="line"><a name="l12763"></a><span class="lineno">12763</span>  json.WriteNumber((uint64_t)m_MaxBlockCount);</div>
+<div class="line"><a name="l12764"></a><span class="lineno">12764</span>  }</div>
+<div class="line"><a name="l12765"></a><span class="lineno">12765</span>  json.WriteString(<span class="stringliteral">"Cur"</span>);</div>
+<div class="line"><a name="l12766"></a><span class="lineno">12766</span>  json.WriteNumber((uint64_t)m_Blocks.size());</div>
+<div class="line"><a name="l12767"></a><span class="lineno">12767</span>  json.EndObject();</div>
<div class="line"><a name="l12768"></a><span class="lineno">12768</span>  </div>
-<div class="line"><a name="l12769"></a><span class="lineno">12769</span>  <span class="keywordflow">if</span>(m_Algorithm != 0)</div>
+<div class="line"><a name="l12769"></a><span class="lineno">12769</span>  <span class="keywordflow">if</span>(m_FrameInUseCount > 0)</div>
<div class="line"><a name="l12770"></a><span class="lineno">12770</span>  {</div>
-<div class="line"><a name="l12771"></a><span class="lineno">12771</span>  json.WriteString(<span class="stringliteral">"Algorithm"</span>);</div>
-<div class="line"><a name="l12772"></a><span class="lineno">12772</span>  json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div>
+<div class="line"><a name="l12771"></a><span class="lineno">12771</span>  json.WriteString(<span class="stringliteral">"FrameInUseCount"</span>);</div>
+<div class="line"><a name="l12772"></a><span class="lineno">12772</span>  json.WriteNumber(m_FrameInUseCount);</div>
<div class="line"><a name="l12773"></a><span class="lineno">12773</span>  }</div>
-<div class="line"><a name="l12774"></a><span class="lineno">12774</span>  }</div>
-<div class="line"><a name="l12775"></a><span class="lineno">12775</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12776"></a><span class="lineno">12776</span>  {</div>
-<div class="line"><a name="l12777"></a><span class="lineno">12777</span>  json.WriteString(<span class="stringliteral">"PreferredBlockSize"</span>);</div>
-<div class="line"><a name="l12778"></a><span class="lineno">12778</span>  json.WriteNumber(m_PreferredBlockSize);</div>
-<div class="line"><a name="l12779"></a><span class="lineno">12779</span>  }</div>
-<div class="line"><a name="l12780"></a><span class="lineno">12780</span>  </div>
-<div class="line"><a name="l12781"></a><span class="lineno">12781</span>  json.WriteString(<span class="stringliteral">"Blocks"</span>);</div>
-<div class="line"><a name="l12782"></a><span class="lineno">12782</span>  json.BeginObject();</div>
-<div class="line"><a name="l12783"></a><span class="lineno">12783</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l12784"></a><span class="lineno">12784</span>  {</div>
-<div class="line"><a name="l12785"></a><span class="lineno">12785</span>  json.BeginString();</div>
-<div class="line"><a name="l12786"></a><span class="lineno">12786</span>  json.ContinueString(m_Blocks[i]->GetId());</div>
-<div class="line"><a name="l12787"></a><span class="lineno">12787</span>  json.EndString();</div>
-<div class="line"><a name="l12788"></a><span class="lineno">12788</span>  </div>
-<div class="line"><a name="l12789"></a><span class="lineno">12789</span>  m_Blocks[i]->m_pMetadata->PrintDetailedMap(json);</div>
-<div class="line"><a name="l12790"></a><span class="lineno">12790</span>  }</div>
-<div class="line"><a name="l12791"></a><span class="lineno">12791</span>  json.EndObject();</div>
-<div class="line"><a name="l12792"></a><span class="lineno">12792</span>  </div>
-<div class="line"><a name="l12793"></a><span class="lineno">12793</span>  json.EndObject();</div>
-<div class="line"><a name="l12794"></a><span class="lineno">12794</span> }</div>
-<div class="line"><a name="l12795"></a><span class="lineno">12795</span>  </div>
-<div class="line"><a name="l12796"></a><span class="lineno">12796</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12797"></a><span class="lineno">12797</span>  </div>
-<div class="line"><a name="l12798"></a><span class="lineno">12798</span> <span class="keywordtype">void</span> VmaBlockVector::Defragment(</div>
-<div class="line"><a name="l12799"></a><span class="lineno">12799</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l12800"></a><span class="lineno">12800</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l12801"></a><span class="lineno">12801</span>  VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l12802"></a><span class="lineno">12802</span>  VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l12803"></a><span class="lineno">12803</span>  VkCommandBuffer commandBuffer)</div>
-<div class="line"><a name="l12804"></a><span class="lineno">12804</span> {</div>
-<div class="line"><a name="l12805"></a><span class="lineno">12805</span>  pCtx->res = VK_SUCCESS;</div>
-<div class="line"><a name="l12806"></a><span class="lineno">12806</span>  </div>
-<div class="line"><a name="l12807"></a><span class="lineno">12807</span>  <span class="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div>
-<div class="line"><a name="l12808"></a><span class="lineno">12808</span>  m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l12809"></a><span class="lineno">12809</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</div>
-<div class="line"><a name="l12810"></a><span class="lineno">12810</span>  </div>
-<div class="line"><a name="l12811"></a><span class="lineno">12811</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove > 0 && maxCpuAllocationsToMove > 0 &&</div>
-<div class="line"><a name="l12812"></a><span class="lineno">12812</span>  isHostVisible;</div>
-<div class="line"><a name="l12813"></a><span class="lineno">12813</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove > 0 && maxGpuAllocationsToMove > 0 &&</div>
-<div class="line"><a name="l12814"></a><span class="lineno">12814</span>  !IsCorruptionDetectionEnabled() &&</div>
-<div class="line"><a name="l12815"></a><span class="lineno">12815</span>  ((1u << m_MemoryTypeIndex) & m_hAllocator->GetGpuDefragmentationMemoryTypeBits()) != 0;</div>
+<div class="line"><a name="l12774"></a><span class="lineno">12774</span>  </div>
+<div class="line"><a name="l12775"></a><span class="lineno">12775</span>  <span class="keywordflow">if</span>(m_Algorithm != 0)</div>
+<div class="line"><a name="l12776"></a><span class="lineno">12776</span>  {</div>
+<div class="line"><a name="l12777"></a><span class="lineno">12777</span>  json.WriteString(<span class="stringliteral">"Algorithm"</span>);</div>
+<div class="line"><a name="l12778"></a><span class="lineno">12778</span>  json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div>
+<div class="line"><a name="l12779"></a><span class="lineno">12779</span>  }</div>
+<div class="line"><a name="l12780"></a><span class="lineno">12780</span>  }</div>
+<div class="line"><a name="l12781"></a><span class="lineno">12781</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12782"></a><span class="lineno">12782</span>  {</div>
+<div class="line"><a name="l12783"></a><span class="lineno">12783</span>  json.WriteString(<span class="stringliteral">"PreferredBlockSize"</span>);</div>
+<div class="line"><a name="l12784"></a><span class="lineno">12784</span>  json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l12785"></a><span class="lineno">12785</span>  }</div>
+<div class="line"><a name="l12786"></a><span class="lineno">12786</span>  </div>
+<div class="line"><a name="l12787"></a><span class="lineno">12787</span>  json.WriteString(<span class="stringliteral">"Blocks"</span>);</div>
+<div class="line"><a name="l12788"></a><span class="lineno">12788</span>  json.BeginObject();</div>
+<div class="line"><a name="l12789"></a><span class="lineno">12789</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l12790"></a><span class="lineno">12790</span>  {</div>
+<div class="line"><a name="l12791"></a><span class="lineno">12791</span>  json.BeginString();</div>
+<div class="line"><a name="l12792"></a><span class="lineno">12792</span>  json.ContinueString(m_Blocks[i]->GetId());</div>
+<div class="line"><a name="l12793"></a><span class="lineno">12793</span>  json.EndString();</div>
+<div class="line"><a name="l12794"></a><span class="lineno">12794</span>  </div>
+<div class="line"><a name="l12795"></a><span class="lineno">12795</span>  m_Blocks[i]->m_pMetadata->PrintDetailedMap(json);</div>
+<div class="line"><a name="l12796"></a><span class="lineno">12796</span>  }</div>
+<div class="line"><a name="l12797"></a><span class="lineno">12797</span>  json.EndObject();</div>
+<div class="line"><a name="l12798"></a><span class="lineno">12798</span>  </div>
+<div class="line"><a name="l12799"></a><span class="lineno">12799</span>  json.EndObject();</div>
+<div class="line"><a name="l12800"></a><span class="lineno">12800</span> }</div>
+<div class="line"><a name="l12801"></a><span class="lineno">12801</span>  </div>
+<div class="line"><a name="l12802"></a><span class="lineno">12802</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12803"></a><span class="lineno">12803</span>  </div>
+<div class="line"><a name="l12804"></a><span class="lineno">12804</span> <span class="keywordtype">void</span> VmaBlockVector::Defragment(</div>
+<div class="line"><a name="l12805"></a><span class="lineno">12805</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l12806"></a><span class="lineno">12806</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l12807"></a><span class="lineno">12807</span>  VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l12808"></a><span class="lineno">12808</span>  VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l12809"></a><span class="lineno">12809</span>  VkCommandBuffer commandBuffer)</div>
+<div class="line"><a name="l12810"></a><span class="lineno">12810</span> {</div>
+<div class="line"><a name="l12811"></a><span class="lineno">12811</span>  pCtx->res = VK_SUCCESS;</div>
+<div class="line"><a name="l12812"></a><span class="lineno">12812</span>  </div>
+<div class="line"><a name="l12813"></a><span class="lineno">12813</span>  <span class="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div>
+<div class="line"><a name="l12814"></a><span class="lineno">12814</span>  m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l12815"></a><span class="lineno">12815</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</div>
<div class="line"><a name="l12816"></a><span class="lineno">12816</span>  </div>
-<div class="line"><a name="l12817"></a><span class="lineno">12817</span>  <span class="comment">// There are options to defragment this memory type.</span></div>
-<div class="line"><a name="l12818"></a><span class="lineno">12818</span>  <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</div>
-<div class="line"><a name="l12819"></a><span class="lineno">12819</span>  {</div>
-<div class="line"><a name="l12820"></a><span class="lineno">12820</span>  <span class="keywordtype">bool</span> defragmentOnGpu;</div>
-<div class="line"><a name="l12821"></a><span class="lineno">12821</span>  <span class="comment">// There is only one option to defragment this memory type.</span></div>
-<div class="line"><a name="l12822"></a><span class="lineno">12822</span>  <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</div>
-<div class="line"><a name="l12823"></a><span class="lineno">12823</span>  {</div>
-<div class="line"><a name="l12824"></a><span class="lineno">12824</span>  defragmentOnGpu = canDefragmentOnGpu;</div>
-<div class="line"><a name="l12825"></a><span class="lineno">12825</span>  }</div>
-<div class="line"><a name="l12826"></a><span class="lineno">12826</span>  <span class="comment">// Both options are available: Heuristics to choose the best one.</span></div>
-<div class="line"><a name="l12827"></a><span class="lineno">12827</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12828"></a><span class="lineno">12828</span>  {</div>
-<div class="line"><a name="l12829"></a><span class="lineno">12829</span>  defragmentOnGpu = (memPropFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div>
-<div class="line"><a name="l12830"></a><span class="lineno">12830</span>  m_hAllocator->IsIntegratedGpu();</div>
+<div class="line"><a name="l12817"></a><span class="lineno">12817</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove > 0 && maxCpuAllocationsToMove > 0 &&</div>
+<div class="line"><a name="l12818"></a><span class="lineno">12818</span>  isHostVisible;</div>
+<div class="line"><a name="l12819"></a><span class="lineno">12819</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove > 0 && maxGpuAllocationsToMove > 0 &&</div>
+<div class="line"><a name="l12820"></a><span class="lineno">12820</span>  !IsCorruptionDetectionEnabled() &&</div>
+<div class="line"><a name="l12821"></a><span class="lineno">12821</span>  ((1u << m_MemoryTypeIndex) & m_hAllocator->GetGpuDefragmentationMemoryTypeBits()) != 0;</div>
+<div class="line"><a name="l12822"></a><span class="lineno">12822</span>  </div>
+<div class="line"><a name="l12823"></a><span class="lineno">12823</span>  <span class="comment">// There are options to defragment this memory type.</span></div>
+<div class="line"><a name="l12824"></a><span class="lineno">12824</span>  <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</div>
+<div class="line"><a name="l12825"></a><span class="lineno">12825</span>  {</div>
+<div class="line"><a name="l12826"></a><span class="lineno">12826</span>  <span class="keywordtype">bool</span> defragmentOnGpu;</div>
+<div class="line"><a name="l12827"></a><span class="lineno">12827</span>  <span class="comment">// There is only one option to defragment this memory type.</span></div>
+<div class="line"><a name="l12828"></a><span class="lineno">12828</span>  <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</div>
+<div class="line"><a name="l12829"></a><span class="lineno">12829</span>  {</div>
+<div class="line"><a name="l12830"></a><span class="lineno">12830</span>  defragmentOnGpu = canDefragmentOnGpu;</div>
<div class="line"><a name="l12831"></a><span class="lineno">12831</span>  }</div>
-<div class="line"><a name="l12832"></a><span class="lineno">12832</span>  </div>
-<div class="line"><a name="l12833"></a><span class="lineno">12833</span>  <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div>
-<div class="line"><a name="l12834"></a><span class="lineno">12834</span>  </div>
-<div class="line"><a name="l12835"></a><span class="lineno">12835</span>  <span class="keywordflow">if</span>(m_hAllocator->m_UseMutex)</div>
-<div class="line"><a name="l12836"></a><span class="lineno">12836</span>  {</div>
-<div class="line"><a name="l12837"></a><span class="lineno">12837</span>  m_Mutex.LockWrite();</div>
-<div class="line"><a name="l12838"></a><span class="lineno">12838</span>  pCtx->mutexLocked = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l12839"></a><span class="lineno">12839</span>  }</div>
+<div class="line"><a name="l12832"></a><span class="lineno">12832</span>  <span class="comment">// Both options are available: Heuristics to choose the best one.</span></div>
+<div class="line"><a name="l12833"></a><span class="lineno">12833</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12834"></a><span class="lineno">12834</span>  {</div>
+<div class="line"><a name="l12835"></a><span class="lineno">12835</span>  defragmentOnGpu = (memPropFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div>
+<div class="line"><a name="l12836"></a><span class="lineno">12836</span>  m_hAllocator->IsIntegratedGpu();</div>
+<div class="line"><a name="l12837"></a><span class="lineno">12837</span>  }</div>
+<div class="line"><a name="l12838"></a><span class="lineno">12838</span>  </div>
+<div class="line"><a name="l12839"></a><span class="lineno">12839</span>  <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div>
<div class="line"><a name="l12840"></a><span class="lineno">12840</span>  </div>
-<div class="line"><a name="l12841"></a><span class="lineno">12841</span>  pCtx->Begin(overlappingMoveSupported);</div>
-<div class="line"><a name="l12842"></a><span class="lineno">12842</span>  </div>
-<div class="line"><a name="l12843"></a><span class="lineno">12843</span>  <span class="comment">// Defragment.</span></div>
-<div class="line"><a name="l12844"></a><span class="lineno">12844</span>  </div>
-<div class="line"><a name="l12845"></a><span class="lineno">12845</span>  <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div>
-<div class="line"><a name="l12846"></a><span class="lineno">12846</span>  <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div>
-<div class="line"><a name="l12847"></a><span class="lineno">12847</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> > moves = </div>
-<div class="line"><a name="l12848"></a><span class="lineno">12848</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >(VmaStlAllocator<VmaDefragmentationMove>(m_hAllocator->GetAllocationCallbacks()));</div>
-<div class="line"><a name="l12849"></a><span class="lineno">12849</span>  pCtx->res = pCtx->GetAlgorithm()->Defragment(moves, maxBytesToMove, maxAllocationsToMove);</div>
+<div class="line"><a name="l12841"></a><span class="lineno">12841</span>  <span class="keywordflow">if</span>(m_hAllocator->m_UseMutex)</div>
+<div class="line"><a name="l12842"></a><span class="lineno">12842</span>  {</div>
+<div class="line"><a name="l12843"></a><span class="lineno">12843</span>  m_Mutex.LockWrite();</div>
+<div class="line"><a name="l12844"></a><span class="lineno">12844</span>  pCtx->mutexLocked = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12845"></a><span class="lineno">12845</span>  }</div>
+<div class="line"><a name="l12846"></a><span class="lineno">12846</span>  </div>
+<div class="line"><a name="l12847"></a><span class="lineno">12847</span>  pCtx->Begin(overlappingMoveSupported);</div>
+<div class="line"><a name="l12848"></a><span class="lineno">12848</span>  </div>
+<div class="line"><a name="l12849"></a><span class="lineno">12849</span>  <span class="comment">// Defragment.</span></div>
<div class="line"><a name="l12850"></a><span class="lineno">12850</span>  </div>
-<div class="line"><a name="l12851"></a><span class="lineno">12851</span>  <span class="comment">// Accumulate statistics.</span></div>
-<div class="line"><a name="l12852"></a><span class="lineno">12852</span>  <span class="keywordflow">if</span>(pStats != VMA_NULL)</div>
-<div class="line"><a name="l12853"></a><span class="lineno">12853</span>  {</div>
-<div class="line"><a name="l12854"></a><span class="lineno">12854</span>  <span class="keyword">const</span> VkDeviceSize bytesMoved = pCtx->GetAlgorithm()->GetBytesMoved();</div>
-<div class="line"><a name="l12855"></a><span class="lineno">12855</span>  <span class="keyword">const</span> uint32_t allocationsMoved = pCtx->GetAlgorithm()->GetAllocationsMoved();</div>
-<div class="line"><a name="l12856"></a><span class="lineno">12856</span>  pStats-><a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div>
-<div class="line"><a name="l12857"></a><span class="lineno">12857</span>  pStats-><a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div>
-<div class="line"><a name="l12858"></a><span class="lineno">12858</span>  VMA_ASSERT(bytesMoved <= maxBytesToMove);</div>
-<div class="line"><a name="l12859"></a><span class="lineno">12859</span>  VMA_ASSERT(allocationsMoved <= maxAllocationsToMove);</div>
-<div class="line"><a name="l12860"></a><span class="lineno">12860</span>  <span class="keywordflow">if</span>(defragmentOnGpu)</div>
-<div class="line"><a name="l12861"></a><span class="lineno">12861</span>  {</div>
-<div class="line"><a name="l12862"></a><span class="lineno">12862</span>  maxGpuBytesToMove -= bytesMoved;</div>
-<div class="line"><a name="l12863"></a><span class="lineno">12863</span>  maxGpuAllocationsToMove -= allocationsMoved;</div>
-<div class="line"><a name="l12864"></a><span class="lineno">12864</span>  }</div>
-<div class="line"><a name="l12865"></a><span class="lineno">12865</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12866"></a><span class="lineno">12866</span>  {</div>
-<div class="line"><a name="l12867"></a><span class="lineno">12867</span>  maxCpuBytesToMove -= bytesMoved;</div>
-<div class="line"><a name="l12868"></a><span class="lineno">12868</span>  maxCpuAllocationsToMove -= allocationsMoved;</div>
-<div class="line"><a name="l12869"></a><span class="lineno">12869</span>  }</div>
-<div class="line"><a name="l12870"></a><span class="lineno">12870</span>  }</div>
-<div class="line"><a name="l12871"></a><span class="lineno">12871</span>  </div>
-<div class="line"><a name="l12872"></a><span class="lineno">12872</span>  <span class="keywordflow">if</span>(pCtx->res >= VK_SUCCESS)</div>
-<div class="line"><a name="l12873"></a><span class="lineno">12873</span>  {</div>
-<div class="line"><a name="l12874"></a><span class="lineno">12874</span>  <span class="keywordflow">if</span>(defragmentOnGpu)</div>
-<div class="line"><a name="l12875"></a><span class="lineno">12875</span>  {</div>
-<div class="line"><a name="l12876"></a><span class="lineno">12876</span>  ApplyDefragmentationMovesGpu(pCtx, moves, commandBuffer);</div>
-<div class="line"><a name="l12877"></a><span class="lineno">12877</span>  }</div>
-<div class="line"><a name="l12878"></a><span class="lineno">12878</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12879"></a><span class="lineno">12879</span>  {</div>
-<div class="line"><a name="l12880"></a><span class="lineno">12880</span>  ApplyDefragmentationMovesCpu(pCtx, moves);</div>
-<div class="line"><a name="l12881"></a><span class="lineno">12881</span>  }</div>
-<div class="line"><a name="l12882"></a><span class="lineno">12882</span>  }</div>
-<div class="line"><a name="l12883"></a><span class="lineno">12883</span>  }</div>
-<div class="line"><a name="l12884"></a><span class="lineno">12884</span> }</div>
-<div class="line"><a name="l12885"></a><span class="lineno">12885</span>  </div>
-<div class="line"><a name="l12886"></a><span class="lineno">12886</span> <span class="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div>
-<div class="line"><a name="l12887"></a><span class="lineno">12887</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l12888"></a><span class="lineno">12888</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
-<div class="line"><a name="l12889"></a><span class="lineno">12889</span> {</div>
-<div class="line"><a name="l12890"></a><span class="lineno">12890</span>  <span class="comment">// Destroy buffers.</span></div>
-<div class="line"><a name="l12891"></a><span class="lineno">12891</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx->blockContexts.size(); blockIndex--; )</div>
-<div class="line"><a name="l12892"></a><span class="lineno">12892</span>  {</div>
-<div class="line"><a name="l12893"></a><span class="lineno">12893</span>  VmaBlockDefragmentationContext& blockCtx = pCtx->blockContexts[blockIndex];</div>
-<div class="line"><a name="l12894"></a><span class="lineno">12894</span>  <span class="keywordflow">if</span>(blockCtx.hBuffer)</div>
-<div class="line"><a name="l12895"></a><span class="lineno">12895</span>  {</div>
-<div class="line"><a name="l12896"></a><span class="lineno">12896</span>  (*m_hAllocator->GetVulkanFunctions().vkDestroyBuffer)(</div>
-<div class="line"><a name="l12897"></a><span class="lineno">12897</span>  m_hAllocator->m_hDevice, blockCtx.hBuffer, m_hAllocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l12898"></a><span class="lineno">12898</span>  }</div>
-<div class="line"><a name="l12899"></a><span class="lineno">12899</span>  }</div>
-<div class="line"><a name="l12900"></a><span class="lineno">12900</span>  </div>
-<div class="line"><a name="l12901"></a><span class="lineno">12901</span>  <span class="keywordflow">if</span>(pCtx->res >= VK_SUCCESS)</div>
-<div class="line"><a name="l12902"></a><span class="lineno">12902</span>  {</div>
-<div class="line"><a name="l12903"></a><span class="lineno">12903</span>  FreeEmptyBlocks(pStats);</div>
-<div class="line"><a name="l12904"></a><span class="lineno">12904</span>  }</div>
-<div class="line"><a name="l12905"></a><span class="lineno">12905</span>  </div>
-<div class="line"><a name="l12906"></a><span class="lineno">12906</span>  <span class="keywordflow">if</span>(pCtx->mutexLocked)</div>
-<div class="line"><a name="l12907"></a><span class="lineno">12907</span>  {</div>
-<div class="line"><a name="l12908"></a><span class="lineno">12908</span>  VMA_ASSERT(m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l12909"></a><span class="lineno">12909</span>  m_Mutex.UnlockWrite();</div>
+<div class="line"><a name="l12851"></a><span class="lineno">12851</span>  <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div>
+<div class="line"><a name="l12852"></a><span class="lineno">12852</span>  <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div>
+<div class="line"><a name="l12853"></a><span class="lineno">12853</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> > moves = </div>
+<div class="line"><a name="l12854"></a><span class="lineno">12854</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >(VmaStlAllocator<VmaDefragmentationMove>(m_hAllocator->GetAllocationCallbacks()));</div>
+<div class="line"><a name="l12855"></a><span class="lineno">12855</span>  pCtx->res = pCtx->GetAlgorithm()->Defragment(moves, maxBytesToMove, maxAllocationsToMove);</div>
+<div class="line"><a name="l12856"></a><span class="lineno">12856</span>  </div>
+<div class="line"><a name="l12857"></a><span class="lineno">12857</span>  <span class="comment">// Accumulate statistics.</span></div>
+<div class="line"><a name="l12858"></a><span class="lineno">12858</span>  <span class="keywordflow">if</span>(pStats != VMA_NULL)</div>
+<div class="line"><a name="l12859"></a><span class="lineno">12859</span>  {</div>
+<div class="line"><a name="l12860"></a><span class="lineno">12860</span>  <span class="keyword">const</span> VkDeviceSize bytesMoved = pCtx->GetAlgorithm()->GetBytesMoved();</div>
+<div class="line"><a name="l12861"></a><span class="lineno">12861</span>  <span class="keyword">const</span> uint32_t allocationsMoved = pCtx->GetAlgorithm()->GetAllocationsMoved();</div>
+<div class="line"><a name="l12862"></a><span class="lineno">12862</span>  pStats-><a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div>
+<div class="line"><a name="l12863"></a><span class="lineno">12863</span>  pStats-><a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div>
+<div class="line"><a name="l12864"></a><span class="lineno">12864</span>  VMA_ASSERT(bytesMoved <= maxBytesToMove);</div>
+<div class="line"><a name="l12865"></a><span class="lineno">12865</span>  VMA_ASSERT(allocationsMoved <= maxAllocationsToMove);</div>
+<div class="line"><a name="l12866"></a><span class="lineno">12866</span>  <span class="keywordflow">if</span>(defragmentOnGpu)</div>
+<div class="line"><a name="l12867"></a><span class="lineno">12867</span>  {</div>
+<div class="line"><a name="l12868"></a><span class="lineno">12868</span>  maxGpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l12869"></a><span class="lineno">12869</span>  maxGpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l12870"></a><span class="lineno">12870</span>  }</div>
+<div class="line"><a name="l12871"></a><span class="lineno">12871</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12872"></a><span class="lineno">12872</span>  {</div>
+<div class="line"><a name="l12873"></a><span class="lineno">12873</span>  maxCpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l12874"></a><span class="lineno">12874</span>  maxCpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l12875"></a><span class="lineno">12875</span>  }</div>
+<div class="line"><a name="l12876"></a><span class="lineno">12876</span>  }</div>
+<div class="line"><a name="l12877"></a><span class="lineno">12877</span>  </div>
+<div class="line"><a name="l12878"></a><span class="lineno">12878</span>  <span class="keywordflow">if</span>(pCtx->res >= VK_SUCCESS)</div>
+<div class="line"><a name="l12879"></a><span class="lineno">12879</span>  {</div>
+<div class="line"><a name="l12880"></a><span class="lineno">12880</span>  <span class="keywordflow">if</span>(defragmentOnGpu)</div>
+<div class="line"><a name="l12881"></a><span class="lineno">12881</span>  {</div>
+<div class="line"><a name="l12882"></a><span class="lineno">12882</span>  ApplyDefragmentationMovesGpu(pCtx, moves, commandBuffer);</div>
+<div class="line"><a name="l12883"></a><span class="lineno">12883</span>  }</div>
+<div class="line"><a name="l12884"></a><span class="lineno">12884</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12885"></a><span class="lineno">12885</span>  {</div>
+<div class="line"><a name="l12886"></a><span class="lineno">12886</span>  ApplyDefragmentationMovesCpu(pCtx, moves);</div>
+<div class="line"><a name="l12887"></a><span class="lineno">12887</span>  }</div>
+<div class="line"><a name="l12888"></a><span class="lineno">12888</span>  }</div>
+<div class="line"><a name="l12889"></a><span class="lineno">12889</span>  }</div>
+<div class="line"><a name="l12890"></a><span class="lineno">12890</span> }</div>
+<div class="line"><a name="l12891"></a><span class="lineno">12891</span>  </div>
+<div class="line"><a name="l12892"></a><span class="lineno">12892</span> <span class="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div>
+<div class="line"><a name="l12893"></a><span class="lineno">12893</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l12894"></a><span class="lineno">12894</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
+<div class="line"><a name="l12895"></a><span class="lineno">12895</span> {</div>
+<div class="line"><a name="l12896"></a><span class="lineno">12896</span>  <span class="comment">// Destroy buffers.</span></div>
+<div class="line"><a name="l12897"></a><span class="lineno">12897</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx->blockContexts.size(); blockIndex--; )</div>
+<div class="line"><a name="l12898"></a><span class="lineno">12898</span>  {</div>
+<div class="line"><a name="l12899"></a><span class="lineno">12899</span>  VmaBlockDefragmentationContext& blockCtx = pCtx->blockContexts[blockIndex];</div>
+<div class="line"><a name="l12900"></a><span class="lineno">12900</span>  <span class="keywordflow">if</span>(blockCtx.hBuffer)</div>
+<div class="line"><a name="l12901"></a><span class="lineno">12901</span>  {</div>
+<div class="line"><a name="l12902"></a><span class="lineno">12902</span>  (*m_hAllocator->GetVulkanFunctions().vkDestroyBuffer)(</div>
+<div class="line"><a name="l12903"></a><span class="lineno">12903</span>  m_hAllocator->m_hDevice, blockCtx.hBuffer, m_hAllocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l12904"></a><span class="lineno">12904</span>  }</div>
+<div class="line"><a name="l12905"></a><span class="lineno">12905</span>  }</div>
+<div class="line"><a name="l12906"></a><span class="lineno">12906</span>  </div>
+<div class="line"><a name="l12907"></a><span class="lineno">12907</span>  <span class="keywordflow">if</span>(pCtx->res >= VK_SUCCESS)</div>
+<div class="line"><a name="l12908"></a><span class="lineno">12908</span>  {</div>
+<div class="line"><a name="l12909"></a><span class="lineno">12909</span>  FreeEmptyBlocks(pStats);</div>
<div class="line"><a name="l12910"></a><span class="lineno">12910</span>  }</div>
-<div class="line"><a name="l12911"></a><span class="lineno">12911</span> }</div>
-<div class="line"><a name="l12912"></a><span class="lineno">12912</span>  </div>
-<div class="line"><a name="l12913"></a><span class="lineno">12913</span> <span class="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12914"></a><span class="lineno">12914</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l12915"></a><span class="lineno">12915</span>  <span class="keywordtype">size_t</span> result = 0;</div>
-<div class="line"><a name="l12916"></a><span class="lineno">12916</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l12917"></a><span class="lineno">12917</span>  {</div>
-<div class="line"><a name="l12918"></a><span class="lineno">12918</span>  result += m_Blocks[i]->m_pMetadata->GetAllocationCount();</div>
-<div class="line"><a name="l12919"></a><span class="lineno">12919</span>  }</div>
-<div class="line"><a name="l12920"></a><span class="lineno">12920</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l12921"></a><span class="lineno">12921</span> }</div>
-<div class="line"><a name="l12922"></a><span class="lineno">12922</span>  </div>
-<div class="line"><a name="l12923"></a><span class="lineno">12923</span> <span class="keywordtype">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12924"></a><span class="lineno">12924</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l12925"></a><span class="lineno">12925</span>  <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</div>
-<div class="line"><a name="l12926"></a><span class="lineno">12926</span>  {</div>
-<div class="line"><a name="l12927"></a><span class="lineno">12927</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12928"></a><span class="lineno">12928</span>  }</div>
-<div class="line"><a name="l12929"></a><span class="lineno">12929</span>  VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l12930"></a><span class="lineno">12930</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i < count; ++i)</div>
-<div class="line"><a name="l12931"></a><span class="lineno">12931</span>  {</div>
-<div class="line"><a name="l12932"></a><span class="lineno">12932</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div>
-<div class="line"><a name="l12933"></a><span class="lineno">12933</span>  VMA_ASSERT(m_Algorithm == 0);</div>
-<div class="line"><a name="l12934"></a><span class="lineno">12934</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock->m_pMetadata;</div>
-<div class="line"><a name="l12935"></a><span class="lineno">12935</span>  <span class="keywordflow">if</span>(pMetadata->IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</div>
-<div class="line"><a name="l12936"></a><span class="lineno">12936</span>  {</div>
-<div class="line"><a name="l12937"></a><span class="lineno">12937</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l12938"></a><span class="lineno">12938</span>  }</div>
-<div class="line"><a name="l12939"></a><span class="lineno">12939</span>  }</div>
-<div class="line"><a name="l12940"></a><span class="lineno">12940</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12941"></a><span class="lineno">12941</span> }</div>
-<div class="line"><a name="l12942"></a><span class="lineno">12942</span>  </div>
-<div class="line"><a name="l12943"></a><span class="lineno">12943</span> <span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div>
-<div class="line"><a name="l12944"></a><span class="lineno">12944</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l12945"></a><span class="lineno">12945</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l12946"></a><span class="lineno">12946</span> {</div>
-<div class="line"><a name="l12947"></a><span class="lineno">12947</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l12948"></a><span class="lineno">12948</span>  <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div>
-<div class="line"><a name="l12949"></a><span class="lineno">12949</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l12950"></a><span class="lineno">12950</span>  {</div>
-<div class="line"><a name="l12951"></a><span class="lineno">12951</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12952"></a><span class="lineno">12952</span>  VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l12953"></a><span class="lineno">12953</span>  lostAllocationCount += pBlock->m_pMetadata->MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div>
-<div class="line"><a name="l12954"></a><span class="lineno">12954</span>  }</div>
-<div class="line"><a name="l12955"></a><span class="lineno">12955</span>  <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div>
+<div class="line"><a name="l12911"></a><span class="lineno">12911</span>  </div>
+<div class="line"><a name="l12912"></a><span class="lineno">12912</span>  <span class="keywordflow">if</span>(pCtx->mutexLocked)</div>
+<div class="line"><a name="l12913"></a><span class="lineno">12913</span>  {</div>
+<div class="line"><a name="l12914"></a><span class="lineno">12914</span>  VMA_ASSERT(m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12915"></a><span class="lineno">12915</span>  m_Mutex.UnlockWrite();</div>
+<div class="line"><a name="l12916"></a><span class="lineno">12916</span>  }</div>
+<div class="line"><a name="l12917"></a><span class="lineno">12917</span> }</div>
+<div class="line"><a name="l12918"></a><span class="lineno">12918</span>  </div>
+<div class="line"><a name="l12919"></a><span class="lineno">12919</span> <span class="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12920"></a><span class="lineno">12920</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l12921"></a><span class="lineno">12921</span>  <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l12922"></a><span class="lineno">12922</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l12923"></a><span class="lineno">12923</span>  {</div>
+<div class="line"><a name="l12924"></a><span class="lineno">12924</span>  result += m_Blocks[i]->m_pMetadata->GetAllocationCount();</div>
+<div class="line"><a name="l12925"></a><span class="lineno">12925</span>  }</div>
+<div class="line"><a name="l12926"></a><span class="lineno">12926</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l12927"></a><span class="lineno">12927</span> }</div>
+<div class="line"><a name="l12928"></a><span class="lineno">12928</span>  </div>
+<div class="line"><a name="l12929"></a><span class="lineno">12929</span> <span class="keywordtype">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12930"></a><span class="lineno">12930</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l12931"></a><span class="lineno">12931</span>  <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</div>
+<div class="line"><a name="l12932"></a><span class="lineno">12932</span>  {</div>
+<div class="line"><a name="l12933"></a><span class="lineno">12933</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12934"></a><span class="lineno">12934</span>  }</div>
+<div class="line"><a name="l12935"></a><span class="lineno">12935</span>  VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l12936"></a><span class="lineno">12936</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i < count; ++i)</div>
+<div class="line"><a name="l12937"></a><span class="lineno">12937</span>  {</div>
+<div class="line"><a name="l12938"></a><span class="lineno">12938</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div>
+<div class="line"><a name="l12939"></a><span class="lineno">12939</span>  VMA_ASSERT(m_Algorithm == 0);</div>
+<div class="line"><a name="l12940"></a><span class="lineno">12940</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock->m_pMetadata;</div>
+<div class="line"><a name="l12941"></a><span class="lineno">12941</span>  <span class="keywordflow">if</span>(pMetadata->IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</div>
+<div class="line"><a name="l12942"></a><span class="lineno">12942</span>  {</div>
+<div class="line"><a name="l12943"></a><span class="lineno">12943</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12944"></a><span class="lineno">12944</span>  }</div>
+<div class="line"><a name="l12945"></a><span class="lineno">12945</span>  }</div>
+<div class="line"><a name="l12946"></a><span class="lineno">12946</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12947"></a><span class="lineno">12947</span> }</div>
+<div class="line"><a name="l12948"></a><span class="lineno">12948</span>  </div>
+<div class="line"><a name="l12949"></a><span class="lineno">12949</span> <span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l12950"></a><span class="lineno">12950</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12951"></a><span class="lineno">12951</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l12952"></a><span class="lineno">12952</span> {</div>
+<div class="line"><a name="l12953"></a><span class="lineno">12953</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12954"></a><span class="lineno">12954</span>  <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div>
+<div class="line"><a name="l12955"></a><span class="lineno">12955</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
<div class="line"><a name="l12956"></a><span class="lineno">12956</span>  {</div>
-<div class="line"><a name="l12957"></a><span class="lineno">12957</span>  *pLostAllocationCount = lostAllocationCount;</div>
-<div class="line"><a name="l12958"></a><span class="lineno">12958</span>  }</div>
-<div class="line"><a name="l12959"></a><span class="lineno">12959</span> }</div>
-<div class="line"><a name="l12960"></a><span class="lineno">12960</span>  </div>
-<div class="line"><a name="l12961"></a><span class="lineno">12961</span> VkResult VmaBlockVector::CheckCorruption()</div>
-<div class="line"><a name="l12962"></a><span class="lineno">12962</span> {</div>
-<div class="line"><a name="l12963"></a><span class="lineno">12963</span>  <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12964"></a><span class="lineno">12964</span>  {</div>
-<div class="line"><a name="l12965"></a><span class="lineno">12965</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l12966"></a><span class="lineno">12966</span>  }</div>
-<div class="line"><a name="l12967"></a><span class="lineno">12967</span>  </div>
-<div class="line"><a name="l12968"></a><span class="lineno">12968</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l12969"></a><span class="lineno">12969</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12957"></a><span class="lineno">12957</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12958"></a><span class="lineno">12958</span>  VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12959"></a><span class="lineno">12959</span>  lostAllocationCount += pBlock->m_pMetadata->MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div>
+<div class="line"><a name="l12960"></a><span class="lineno">12960</span>  }</div>
+<div class="line"><a name="l12961"></a><span class="lineno">12961</span>  <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div>
+<div class="line"><a name="l12962"></a><span class="lineno">12962</span>  {</div>
+<div class="line"><a name="l12963"></a><span class="lineno">12963</span>  *pLostAllocationCount = lostAllocationCount;</div>
+<div class="line"><a name="l12964"></a><span class="lineno">12964</span>  }</div>
+<div class="line"><a name="l12965"></a><span class="lineno">12965</span> }</div>
+<div class="line"><a name="l12966"></a><span class="lineno">12966</span>  </div>
+<div class="line"><a name="l12967"></a><span class="lineno">12967</span> VkResult VmaBlockVector::CheckCorruption()</div>
+<div class="line"><a name="l12968"></a><span class="lineno">12968</span> {</div>
+<div class="line"><a name="l12969"></a><span class="lineno">12969</span>  <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div>
<div class="line"><a name="l12970"></a><span class="lineno">12970</span>  {</div>
-<div class="line"><a name="l12971"></a><span class="lineno">12971</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12972"></a><span class="lineno">12972</span>  VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l12973"></a><span class="lineno">12973</span>  VkResult res = pBlock->CheckCorruption(m_hAllocator);</div>
-<div class="line"><a name="l12974"></a><span class="lineno">12974</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12975"></a><span class="lineno">12975</span>  {</div>
-<div class="line"><a name="l12976"></a><span class="lineno">12976</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12977"></a><span class="lineno">12977</span>  }</div>
-<div class="line"><a name="l12978"></a><span class="lineno">12978</span>  }</div>
-<div class="line"><a name="l12979"></a><span class="lineno">12979</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12980"></a><span class="lineno">12980</span> }</div>
-<div class="line"><a name="l12981"></a><span class="lineno">12981</span>  </div>
-<div class="line"><a name="l12982"></a><span class="lineno">12982</span> <span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
-<div class="line"><a name="l12983"></a><span class="lineno">12983</span> {</div>
-<div class="line"><a name="l12984"></a><span class="lineno">12984</span>  <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div>
-<div class="line"><a name="l12985"></a><span class="lineno">12985</span>  <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l12986"></a><span class="lineno">12986</span>  </div>
-<div class="line"><a name="l12987"></a><span class="lineno">12987</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
-<div class="line"><a name="l12988"></a><span class="lineno">12988</span>  </div>
-<div class="line"><a name="l12989"></a><span class="lineno">12989</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l12990"></a><span class="lineno">12990</span>  {</div>
-<div class="line"><a name="l12991"></a><span class="lineno">12991</span>  <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12992"></a><span class="lineno">12992</span>  VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l12993"></a><span class="lineno">12993</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
-<div class="line"><a name="l12994"></a><span class="lineno">12994</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
-<div class="line"><a name="l12995"></a><span class="lineno">12995</span>  pBlock->m_pMetadata->CalcAllocationStatInfo(allocationStatInfo);</div>
-<div class="line"><a name="l12996"></a><span class="lineno">12996</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
-<div class="line"><a name="l12997"></a><span class="lineno">12997</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
-<div class="line"><a name="l12998"></a><span class="lineno">12998</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
-<div class="line"><a name="l12999"></a><span class="lineno">12999</span>  }</div>
-<div class="line"><a name="l13000"></a><span class="lineno">13000</span> }</div>
-<div class="line"><a name="l13001"></a><span class="lineno">13001</span>  </div>
-<div class="line"><a name="l13003"></a><span class="lineno">13003</span> <span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></div>
-<div class="line"><a name="l13004"></a><span class="lineno">13004</span>  </div>
-<div class="line"><a name="l13005"></a><span class="lineno">13005</span> VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div>
-<div class="line"><a name="l13006"></a><span class="lineno">13006</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l13007"></a><span class="lineno">13007</span>  VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l13008"></a><span class="lineno">13008</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l13009"></a><span class="lineno">13009</span>  <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
-<div class="line"><a name="l13010"></a><span class="lineno">13010</span>  VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
-<div class="line"><a name="l13011"></a><span class="lineno">13011</span>  m_AllocationCount(0),</div>
-<div class="line"><a name="l13012"></a><span class="lineno">13012</span>  m_AllAllocations(false),</div>
-<div class="line"><a name="l13013"></a><span class="lineno">13013</span>  m_BytesMoved(0),</div>
-<div class="line"><a name="l13014"></a><span class="lineno">13014</span>  m_AllocationsMoved(0),</div>
-<div class="line"><a name="l13015"></a><span class="lineno">13015</span>  m_Blocks(VmaStlAllocator<BlockInfo*>(hAllocator->GetAllocationCallbacks()))</div>
-<div class="line"><a name="l13016"></a><span class="lineno">13016</span> {</div>
-<div class="line"><a name="l13017"></a><span class="lineno">13017</span>  <span class="comment">// Create block info for each block.</span></div>
-<div class="line"><a name="l13018"></a><span class="lineno">13018</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->m_Blocks.size();</div>
-<div class="line"><a name="l13019"></a><span class="lineno">13019</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13020"></a><span class="lineno">13020</span>  {</div>
-<div class="line"><a name="l13021"></a><span class="lineno">13021</span>  BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l13022"></a><span class="lineno">13022</span>  pBlockInfo->m_OriginalBlockIndex = blockIndex;</div>
-<div class="line"><a name="l13023"></a><span class="lineno">13023</span>  pBlockInfo->m_pBlock = m_pBlockVector->m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13024"></a><span class="lineno">13024</span>  m_Blocks.push_back(pBlockInfo);</div>
-<div class="line"><a name="l13025"></a><span class="lineno">13025</span>  }</div>
-<div class="line"><a name="l13026"></a><span class="lineno">13026</span>  </div>
-<div class="line"><a name="l13027"></a><span class="lineno">13027</span>  <span class="comment">// Sort them by m_pBlock pointer value.</span></div>
-<div class="line"><a name="l13028"></a><span class="lineno">13028</span>  VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div>
-<div class="line"><a name="l13029"></a><span class="lineno">13029</span> }</div>
-<div class="line"><a name="l13030"></a><span class="lineno">13030</span>  </div>
-<div class="line"><a name="l13031"></a><span class="lineno">13031</span> VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</div>
-<div class="line"><a name="l13032"></a><span class="lineno">13032</span> {</div>
-<div class="line"><a name="l13033"></a><span class="lineno">13033</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
-<div class="line"><a name="l13034"></a><span class="lineno">13034</span>  {</div>
-<div class="line"><a name="l13035"></a><span class="lineno">13035</span>  vma_delete(m_hAllocator, m_Blocks[i]);</div>
-<div class="line"><a name="l13036"></a><span class="lineno">13036</span>  }</div>
-<div class="line"><a name="l13037"></a><span class="lineno">13037</span> }</div>
-<div class="line"><a name="l13038"></a><span class="lineno">13038</span>  </div>
-<div class="line"><a name="l13039"></a><span class="lineno">13039</span> <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="l13040"></a><span class="lineno">13040</span> {</div>
-<div class="line"><a name="l13041"></a><span class="lineno">13041</span>  <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="l13042"></a><span class="lineno">13042</span>  <span class="keywordflow">if</span>(hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l13043"></a><span class="lineno">13043</span>  {</div>
-<div class="line"><a name="l13044"></a><span class="lineno">13044</span>  VmaDeviceMemoryBlock* pBlock = hAlloc->GetBlock();</div>
-<div class="line"><a name="l13045"></a><span class="lineno">13045</span>  BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div>
-<div class="line"><a name="l13046"></a><span class="lineno">13046</span>  <span class="keywordflow">if</span>(it != m_Blocks.end() && (*it)->m_pBlock == pBlock)</div>
-<div class="line"><a name="l13047"></a><span class="lineno">13047</span>  {</div>
-<div class="line"><a name="l13048"></a><span class="lineno">13048</span>  AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div>
-<div class="line"><a name="l13049"></a><span class="lineno">13049</span>  (*it)->m_Allocations.push_back(allocInfo);</div>
-<div class="line"><a name="l13050"></a><span class="lineno">13050</span>  }</div>
-<div class="line"><a name="l13051"></a><span class="lineno">13051</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13052"></a><span class="lineno">13052</span>  {</div>
-<div class="line"><a name="l13053"></a><span class="lineno">13053</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l13054"></a><span class="lineno">13054</span>  }</div>
-<div class="line"><a name="l13055"></a><span class="lineno">13055</span>  </div>
-<div class="line"><a name="l13056"></a><span class="lineno">13056</span>  ++m_AllocationCount;</div>
-<div class="line"><a name="l13057"></a><span class="lineno">13057</span>  }</div>
-<div class="line"><a name="l13058"></a><span class="lineno">13058</span> }</div>
-<div class="line"><a name="l13059"></a><span class="lineno">13059</span>  </div>
-<div class="line"><a name="l13060"></a><span class="lineno">13060</span> VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div>
-<div class="line"><a name="l13061"></a><span class="lineno">13061</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
-<div class="line"><a name="l13062"></a><span class="lineno">13062</span>  VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l13063"></a><span class="lineno">13063</span>  uint32_t maxAllocationsToMove)</div>
-<div class="line"><a name="l13064"></a><span class="lineno">13064</span> {</div>
-<div class="line"><a name="l13065"></a><span class="lineno">13065</span>  <span class="keywordflow">if</span>(m_Blocks.empty())</div>
-<div class="line"><a name="l13066"></a><span class="lineno">13066</span>  {</div>
-<div class="line"><a name="l13067"></a><span class="lineno">13067</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13068"></a><span class="lineno">13068</span>  }</div>
-<div class="line"><a name="l13069"></a><span class="lineno">13069</span>  </div>
-<div class="line"><a name="l13070"></a><span class="lineno">13070</span>  <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l13071"></a><span class="lineno">13071</span>  <span class="comment">// Option 1:</span></div>
-<div class="line"><a name="l13072"></a><span class="lineno">13072</span>  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="l13073"></a><span class="lineno">13073</span>  <span class="comment">// Option 2:</span></div>
-<div class="line"><a name="l13074"></a><span class="lineno">13074</span>  <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div>
-<div class="line"><a name="l13075"></a><span class="lineno">13075</span>  <span class="comment">// Option 3:</span></div>
-<div class="line"><a name="l13076"></a><span class="lineno">13076</span>  <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div>
-<div class="line"><a name="l13077"></a><span class="lineno">13077</span>  </div>
-<div class="line"><a name="l13078"></a><span class="lineno">13078</span>  <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div>
-<div class="line"><a name="l13079"></a><span class="lineno">13079</span>  <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="l13080"></a><span class="lineno">13080</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l13081"></a><span class="lineno">13081</span> <span class="comment"> if(m_AlgorithmFlags & VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div>
-<div class="line"><a name="l13082"></a><span class="lineno">13082</span> <span class="comment"> {</span></div>
-<div class="line"><a name="l13083"></a><span class="lineno">13083</span> <span class="comment"> const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div>
-<div class="line"><a name="l13084"></a><span class="lineno">13084</span> <span class="comment"> if(blocksWithNonMovableCount > 0)</span></div>
-<div class="line"><a name="l13085"></a><span class="lineno">13085</span> <span class="comment"> {</span></div>
-<div class="line"><a name="l13086"></a><span class="lineno">13086</span> <span class="comment"> srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div>
-<div class="line"><a name="l13087"></a><span class="lineno">13087</span> <span class="comment"> }</span></div>
-<div class="line"><a name="l13088"></a><span class="lineno">13088</span> <span class="comment"> }</span></div>
-<div class="line"><a name="l13089"></a><span class="lineno">13089</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l13090"></a><span class="lineno">13090</span>  </div>
-<div class="line"><a name="l13091"></a><span class="lineno">13091</span>  <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div>
-<div class="line"><a name="l13092"></a><span class="lineno">13092</span>  <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13093"></a><span class="lineno">13093</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l13094"></a><span class="lineno">13094</span>  {</div>
-<div class="line"><a name="l13095"></a><span class="lineno">13095</span>  <span class="comment">// 1. Find next allocation to move.</span></div>
-<div class="line"><a name="l13096"></a><span class="lineno">13096</span>  <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most "destination" to most "source".</span></div>
-<div class="line"><a name="l13097"></a><span class="lineno">13097</span>  <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div>
-<div class="line"><a name="l13098"></a><span class="lineno">13098</span>  <span class="keywordflow">while</span>(srcAllocIndex >= m_Blocks[srcBlockIndex]->m_Allocations.size())</div>
-<div class="line"><a name="l13099"></a><span class="lineno">13099</span>  {</div>
-<div class="line"><a name="l13100"></a><span class="lineno">13100</span>  <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]->m_Allocations.empty())</div>
-<div class="line"><a name="l13101"></a><span class="lineno">13101</span>  {</div>
-<div class="line"><a name="l13102"></a><span class="lineno">13102</span>  <span class="comment">// Finished: no more allocations to process.</span></div>
-<div class="line"><a name="l13103"></a><span class="lineno">13103</span>  <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</div>
-<div class="line"><a name="l13104"></a><span class="lineno">13104</span>  {</div>
-<div class="line"><a name="l13105"></a><span class="lineno">13105</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13106"></a><span class="lineno">13106</span>  }</div>
-<div class="line"><a name="l13107"></a><span class="lineno">13107</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13108"></a><span class="lineno">13108</span>  {</div>
-<div class="line"><a name="l13109"></a><span class="lineno">13109</span>  --srcBlockIndex;</div>
-<div class="line"><a name="l13110"></a><span class="lineno">13110</span>  srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13111"></a><span class="lineno">13111</span>  }</div>
-<div class="line"><a name="l13112"></a><span class="lineno">13112</span>  }</div>
-<div class="line"><a name="l13113"></a><span class="lineno">13113</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13114"></a><span class="lineno">13114</span>  {</div>
-<div class="line"><a name="l13115"></a><span class="lineno">13115</span>  srcAllocIndex = m_Blocks[srcBlockIndex]->m_Allocations.size() - 1;</div>
-<div class="line"><a name="l13116"></a><span class="lineno">13116</span>  }</div>
-<div class="line"><a name="l13117"></a><span class="lineno">13117</span>  }</div>
-<div class="line"><a name="l13118"></a><span class="lineno">13118</span>  </div>
-<div class="line"><a name="l13119"></a><span class="lineno">13119</span>  BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div>
-<div class="line"><a name="l13120"></a><span class="lineno">13120</span>  AllocationInfo& allocInfo = pSrcBlockInfo->m_Allocations[srcAllocIndex];</div>
-<div class="line"><a name="l13121"></a><span class="lineno">13121</span>  </div>
-<div class="line"><a name="l13122"></a><span class="lineno">13122</span>  <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation->GetSize();</div>
-<div class="line"><a name="l13123"></a><span class="lineno">13123</span>  <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation->GetOffset();</div>
-<div class="line"><a name="l13124"></a><span class="lineno">13124</span>  <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation->GetAlignment();</div>
-<div class="line"><a name="l13125"></a><span class="lineno">13125</span>  <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation->GetSuballocationType();</div>
-<div class="line"><a name="l13126"></a><span class="lineno">13126</span>  </div>
-<div class="line"><a name="l13127"></a><span class="lineno">13127</span>  <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div>
-<div class="line"><a name="l13128"></a><span class="lineno">13128</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex <= srcBlockIndex; ++dstBlockIndex)</div>
-<div class="line"><a name="l13129"></a><span class="lineno">13129</span>  {</div>
-<div class="line"><a name="l13130"></a><span class="lineno">13130</span>  BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div>
-<div class="line"><a name="l13131"></a><span class="lineno">13131</span>  VmaAllocationRequest dstAllocRequest;</div>
-<div class="line"><a name="l13132"></a><span class="lineno">13132</span>  <span class="keywordflow">if</span>(pDstBlockInfo->m_pBlock->m_pMetadata->CreateAllocationRequest(</div>
-<div class="line"><a name="l13133"></a><span class="lineno">13133</span>  m_CurrentFrameIndex,</div>
-<div class="line"><a name="l13134"></a><span class="lineno">13134</span>  m_pBlockVector->GetFrameInUseCount(),</div>
-<div class="line"><a name="l13135"></a><span class="lineno">13135</span>  m_pBlockVector->GetBufferImageGranularity(),</div>
-<div class="line"><a name="l13136"></a><span class="lineno">13136</span>  size,</div>
-<div class="line"><a name="l13137"></a><span class="lineno">13137</span>  alignment,</div>
-<div class="line"><a name="l13138"></a><span class="lineno">13138</span>  <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div>
-<div class="line"><a name="l13139"></a><span class="lineno">13139</span>  suballocType,</div>
-<div class="line"><a name="l13140"></a><span class="lineno">13140</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l13141"></a><span class="lineno">13141</span>  strategy,</div>
-<div class="line"><a name="l13142"></a><span class="lineno">13142</span>  &dstAllocRequest) &&</div>
-<div class="line"><a name="l13143"></a><span class="lineno">13143</span>  MoveMakesSense(</div>
-<div class="line"><a name="l13144"></a><span class="lineno">13144</span>  dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div>
-<div class="line"><a name="l13145"></a><span class="lineno">13145</span>  {</div>
-<div class="line"><a name="l13146"></a><span class="lineno">13146</span>  VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div>
-<div class="line"><a name="l13147"></a><span class="lineno">13147</span>  </div>
-<div class="line"><a name="l13148"></a><span class="lineno">13148</span>  <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div>
-<div class="line"><a name="l13149"></a><span class="lineno">13149</span>  <span class="keywordflow">if</span>((m_AllocationsMoved + 1 > maxAllocationsToMove) ||</div>
-<div class="line"><a name="l13150"></a><span class="lineno">13150</span>  (m_BytesMoved + size > maxBytesToMove))</div>
-<div class="line"><a name="l13151"></a><span class="lineno">13151</span>  {</div>
-<div class="line"><a name="l13152"></a><span class="lineno">13152</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13153"></a><span class="lineno">13153</span>  }</div>
-<div class="line"><a name="l13154"></a><span class="lineno">13154</span>  </div>
-<div class="line"><a name="l13155"></a><span class="lineno">13155</span>  VmaDefragmentationMove move;</div>
-<div class="line"><a name="l13156"></a><span class="lineno">13156</span>  move.srcBlockIndex = pSrcBlockInfo->m_OriginalBlockIndex;</div>
-<div class="line"><a name="l13157"></a><span class="lineno">13157</span>  move.dstBlockIndex = pDstBlockInfo->m_OriginalBlockIndex;</div>
-<div class="line"><a name="l13158"></a><span class="lineno">13158</span>  move.srcOffset = srcOffset;</div>
-<div class="line"><a name="l13159"></a><span class="lineno">13159</span>  move.dstOffset = dstAllocRequest.offset;</div>
-<div class="line"><a name="l13160"></a><span class="lineno">13160</span>  move.size = size;</div>
-<div class="line"><a name="l13161"></a><span class="lineno">13161</span>  moves.push_back(move);</div>
-<div class="line"><a name="l13162"></a><span class="lineno">13162</span>  </div>
-<div class="line"><a name="l13163"></a><span class="lineno">13163</span>  pDstBlockInfo->m_pBlock->m_pMetadata->Alloc(</div>
-<div class="line"><a name="l13164"></a><span class="lineno">13164</span>  dstAllocRequest,</div>
-<div class="line"><a name="l13165"></a><span class="lineno">13165</span>  suballocType,</div>
-<div class="line"><a name="l13166"></a><span class="lineno">13166</span>  size,</div>
-<div class="line"><a name="l13167"></a><span class="lineno">13167</span>  allocInfo.m_hAllocation);</div>
-<div class="line"><a name="l13168"></a><span class="lineno">13168</span>  pSrcBlockInfo->m_pBlock->m_pMetadata->FreeAtOffset(srcOffset);</div>
-<div class="line"><a name="l13169"></a><span class="lineno">13169</span>  </div>
-<div class="line"><a name="l13170"></a><span class="lineno">13170</span>  allocInfo.m_hAllocation->ChangeBlockAllocation(m_hAllocator, pDstBlockInfo->m_pBlock, dstAllocRequest.offset);</div>
-<div class="line"><a name="l13171"></a><span class="lineno">13171</span>  </div>
-<div class="line"><a name="l13172"></a><span class="lineno">13172</span>  <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div>
-<div class="line"><a name="l13173"></a><span class="lineno">13173</span>  {</div>
-<div class="line"><a name="l13174"></a><span class="lineno">13174</span>  *allocInfo.m_pChanged = VK_TRUE;</div>
-<div class="line"><a name="l13175"></a><span class="lineno">13175</span>  }</div>
-<div class="line"><a name="l13176"></a><span class="lineno">13176</span>  </div>
-<div class="line"><a name="l13177"></a><span class="lineno">13177</span>  ++m_AllocationsMoved;</div>
-<div class="line"><a name="l13178"></a><span class="lineno">13178</span>  m_BytesMoved += size;</div>
-<div class="line"><a name="l13179"></a><span class="lineno">13179</span>  </div>
-<div class="line"><a name="l13180"></a><span class="lineno">13180</span>  VmaVectorRemove(pSrcBlockInfo->m_Allocations, srcAllocIndex);</div>
-<div class="line"><a name="l13181"></a><span class="lineno">13181</span>  </div>
-<div class="line"><a name="l13182"></a><span class="lineno">13182</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13183"></a><span class="lineno">13183</span>  }</div>
-<div class="line"><a name="l13184"></a><span class="lineno">13184</span>  }</div>
+<div class="line"><a name="l12971"></a><span class="lineno">12971</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l12972"></a><span class="lineno">12972</span>  }</div>
+<div class="line"><a name="l12973"></a><span class="lineno">12973</span>  </div>
+<div class="line"><a name="l12974"></a><span class="lineno">12974</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12975"></a><span class="lineno">12975</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12976"></a><span class="lineno">12976</span>  {</div>
+<div class="line"><a name="l12977"></a><span class="lineno">12977</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12978"></a><span class="lineno">12978</span>  VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12979"></a><span class="lineno">12979</span>  VkResult res = pBlock->CheckCorruption(m_hAllocator);</div>
+<div class="line"><a name="l12980"></a><span class="lineno">12980</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12981"></a><span class="lineno">12981</span>  {</div>
+<div class="line"><a name="l12982"></a><span class="lineno">12982</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12983"></a><span class="lineno">12983</span>  }</div>
+<div class="line"><a name="l12984"></a><span class="lineno">12984</span>  }</div>
+<div class="line"><a name="l12985"></a><span class="lineno">12985</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12986"></a><span class="lineno">12986</span> }</div>
+<div class="line"><a name="l12987"></a><span class="lineno">12987</span>  </div>
+<div class="line"><a name="l12988"></a><span class="lineno">12988</span> <span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l12989"></a><span class="lineno">12989</span> {</div>
+<div class="line"><a name="l12990"></a><span class="lineno">12990</span>  <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l12991"></a><span class="lineno">12991</span>  <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l12992"></a><span class="lineno">12992</span>  </div>
+<div class="line"><a name="l12993"></a><span class="lineno">12993</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div>
+<div class="line"><a name="l12994"></a><span class="lineno">12994</span>  </div>
+<div class="line"><a name="l12995"></a><span class="lineno">12995</span>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l12996"></a><span class="lineno">12996</span>  {</div>
+<div class="line"><a name="l12997"></a><span class="lineno">12997</span>  <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12998"></a><span class="lineno">12998</span>  VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12999"></a><span class="lineno">12999</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div>
+<div class="line"><a name="l13000"></a><span class="lineno">13000</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l13001"></a><span class="lineno">13001</span>  pBlock->m_pMetadata->CalcAllocationStatInfo(allocationStatInfo);</div>
+<div class="line"><a name="l13002"></a><span class="lineno">13002</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l13003"></a><span class="lineno">13003</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l13004"></a><span class="lineno">13004</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
+<div class="line"><a name="l13005"></a><span class="lineno">13005</span>  }</div>
+<div class="line"><a name="l13006"></a><span class="lineno">13006</span> }</div>
+<div class="line"><a name="l13007"></a><span class="lineno">13007</span>  </div>
+<div class="line"><a name="l13009"></a><span class="lineno">13009</span> <span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></div>
+<div class="line"><a name="l13010"></a><span class="lineno">13010</span>  </div>
+<div class="line"><a name="l13011"></a><span class="lineno">13011</span> VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div>
+<div class="line"><a name="l13012"></a><span class="lineno">13012</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13013"></a><span class="lineno">13013</span>  VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l13014"></a><span class="lineno">13014</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l13015"></a><span class="lineno">13015</span>  <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l13016"></a><span class="lineno">13016</span>  VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l13017"></a><span class="lineno">13017</span>  m_AllocationCount(0),</div>
+<div class="line"><a name="l13018"></a><span class="lineno">13018</span>  m_AllAllocations(false),</div>
+<div class="line"><a name="l13019"></a><span class="lineno">13019</span>  m_BytesMoved(0),</div>
+<div class="line"><a name="l13020"></a><span class="lineno">13020</span>  m_AllocationsMoved(0),</div>
+<div class="line"><a name="l13021"></a><span class="lineno">13021</span>  m_Blocks(VmaStlAllocator<BlockInfo*>(hAllocator->GetAllocationCallbacks()))</div>
+<div class="line"><a name="l13022"></a><span class="lineno">13022</span> {</div>
+<div class="line"><a name="l13023"></a><span class="lineno">13023</span>  <span class="comment">// Create block info for each block.</span></div>
+<div class="line"><a name="l13024"></a><span class="lineno">13024</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->m_Blocks.size();</div>
+<div class="line"><a name="l13025"></a><span class="lineno">13025</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13026"></a><span class="lineno">13026</span>  {</div>
+<div class="line"><a name="l13027"></a><span class="lineno">13027</span>  BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l13028"></a><span class="lineno">13028</span>  pBlockInfo->m_OriginalBlockIndex = blockIndex;</div>
+<div class="line"><a name="l13029"></a><span class="lineno">13029</span>  pBlockInfo->m_pBlock = m_pBlockVector->m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13030"></a><span class="lineno">13030</span>  m_Blocks.push_back(pBlockInfo);</div>
+<div class="line"><a name="l13031"></a><span class="lineno">13031</span>  }</div>
+<div class="line"><a name="l13032"></a><span class="lineno">13032</span>  </div>
+<div class="line"><a name="l13033"></a><span class="lineno">13033</span>  <span class="comment">// Sort them by m_pBlock pointer value.</span></div>
+<div class="line"><a name="l13034"></a><span class="lineno">13034</span>  VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div>
+<div class="line"><a name="l13035"></a><span class="lineno">13035</span> }</div>
+<div class="line"><a name="l13036"></a><span class="lineno">13036</span>  </div>
+<div class="line"><a name="l13037"></a><span class="lineno">13037</span> VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</div>
+<div class="line"><a name="l13038"></a><span class="lineno">13038</span> {</div>
+<div class="line"><a name="l13039"></a><span class="lineno">13039</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l13040"></a><span class="lineno">13040</span>  {</div>
+<div class="line"><a name="l13041"></a><span class="lineno">13041</span>  vma_delete(m_hAllocator, m_Blocks[i]);</div>
+<div class="line"><a name="l13042"></a><span class="lineno">13042</span>  }</div>
+<div class="line"><a name="l13043"></a><span class="lineno">13043</span> }</div>
+<div class="line"><a name="l13044"></a><span class="lineno">13044</span>  </div>
+<div class="line"><a name="l13045"></a><span class="lineno">13045</span> <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="l13046"></a><span class="lineno">13046</span> {</div>
+<div class="line"><a name="l13047"></a><span class="lineno">13047</span>  <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="l13048"></a><span class="lineno">13048</span>  <span class="keywordflow">if</span>(hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l13049"></a><span class="lineno">13049</span>  {</div>
+<div class="line"><a name="l13050"></a><span class="lineno">13050</span>  VmaDeviceMemoryBlock* pBlock = hAlloc->GetBlock();</div>
+<div class="line"><a name="l13051"></a><span class="lineno">13051</span>  BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div>
+<div class="line"><a name="l13052"></a><span class="lineno">13052</span>  <span class="keywordflow">if</span>(it != m_Blocks.end() && (*it)->m_pBlock == pBlock)</div>
+<div class="line"><a name="l13053"></a><span class="lineno">13053</span>  {</div>
+<div class="line"><a name="l13054"></a><span class="lineno">13054</span>  AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div>
+<div class="line"><a name="l13055"></a><span class="lineno">13055</span>  (*it)->m_Allocations.push_back(allocInfo);</div>
+<div class="line"><a name="l13056"></a><span class="lineno">13056</span>  }</div>
+<div class="line"><a name="l13057"></a><span class="lineno">13057</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13058"></a><span class="lineno">13058</span>  {</div>
+<div class="line"><a name="l13059"></a><span class="lineno">13059</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l13060"></a><span class="lineno">13060</span>  }</div>
+<div class="line"><a name="l13061"></a><span class="lineno">13061</span>  </div>
+<div class="line"><a name="l13062"></a><span class="lineno">13062</span>  ++m_AllocationCount;</div>
+<div class="line"><a name="l13063"></a><span class="lineno">13063</span>  }</div>
+<div class="line"><a name="l13064"></a><span class="lineno">13064</span> }</div>
+<div class="line"><a name="l13065"></a><span class="lineno">13065</span>  </div>
+<div class="line"><a name="l13066"></a><span class="lineno">13066</span> VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div>
+<div class="line"><a name="l13067"></a><span class="lineno">13067</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
+<div class="line"><a name="l13068"></a><span class="lineno">13068</span>  VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l13069"></a><span class="lineno">13069</span>  uint32_t maxAllocationsToMove)</div>
+<div class="line"><a name="l13070"></a><span class="lineno">13070</span> {</div>
+<div class="line"><a name="l13071"></a><span class="lineno">13071</span>  <span class="keywordflow">if</span>(m_Blocks.empty())</div>
+<div class="line"><a name="l13072"></a><span class="lineno">13072</span>  {</div>
+<div class="line"><a name="l13073"></a><span class="lineno">13073</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13074"></a><span class="lineno">13074</span>  }</div>
+<div class="line"><a name="l13075"></a><span class="lineno">13075</span>  </div>
+<div class="line"><a name="l13076"></a><span class="lineno">13076</span>  <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l13077"></a><span class="lineno">13077</span>  <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l13078"></a><span class="lineno">13078</span>  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="l13079"></a><span class="lineno">13079</span>  <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l13080"></a><span class="lineno">13080</span>  <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div>
+<div class="line"><a name="l13081"></a><span class="lineno">13081</span>  <span class="comment">// Option 3:</span></div>
+<div class="line"><a name="l13082"></a><span class="lineno">13082</span>  <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div>
+<div class="line"><a name="l13083"></a><span class="lineno">13083</span>  </div>
+<div class="line"><a name="l13084"></a><span class="lineno">13084</span>  <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div>
+<div class="line"><a name="l13085"></a><span class="lineno">13085</span>  <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="l13086"></a><span class="lineno">13086</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l13087"></a><span class="lineno">13087</span> <span class="comment"> if(m_AlgorithmFlags & VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div>
+<div class="line"><a name="l13088"></a><span class="lineno">13088</span> <span class="comment"> {</span></div>
+<div class="line"><a name="l13089"></a><span class="lineno">13089</span> <span class="comment"> const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div>
+<div class="line"><a name="l13090"></a><span class="lineno">13090</span> <span class="comment"> if(blocksWithNonMovableCount > 0)</span></div>
+<div class="line"><a name="l13091"></a><span class="lineno">13091</span> <span class="comment"> {</span></div>
+<div class="line"><a name="l13092"></a><span class="lineno">13092</span> <span class="comment"> srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div>
+<div class="line"><a name="l13093"></a><span class="lineno">13093</span> <span class="comment"> }</span></div>
+<div class="line"><a name="l13094"></a><span class="lineno">13094</span> <span class="comment"> }</span></div>
+<div class="line"><a name="l13095"></a><span class="lineno">13095</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l13096"></a><span class="lineno">13096</span>  </div>
+<div class="line"><a name="l13097"></a><span class="lineno">13097</span>  <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l13098"></a><span class="lineno">13098</span>  <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l13099"></a><span class="lineno">13099</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l13100"></a><span class="lineno">13100</span>  {</div>
+<div class="line"><a name="l13101"></a><span class="lineno">13101</span>  <span class="comment">// 1. Find next allocation to move.</span></div>
+<div class="line"><a name="l13102"></a><span class="lineno">13102</span>  <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most "destination" to most "source".</span></div>
+<div class="line"><a name="l13103"></a><span class="lineno">13103</span>  <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div>
+<div class="line"><a name="l13104"></a><span class="lineno">13104</span>  <span class="keywordflow">while</span>(srcAllocIndex >= m_Blocks[srcBlockIndex]->m_Allocations.size())</div>
+<div class="line"><a name="l13105"></a><span class="lineno">13105</span>  {</div>
+<div class="line"><a name="l13106"></a><span class="lineno">13106</span>  <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]->m_Allocations.empty())</div>
+<div class="line"><a name="l13107"></a><span class="lineno">13107</span>  {</div>
+<div class="line"><a name="l13108"></a><span class="lineno">13108</span>  <span class="comment">// Finished: no more allocations to process.</span></div>
+<div class="line"><a name="l13109"></a><span class="lineno">13109</span>  <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</div>
+<div class="line"><a name="l13110"></a><span class="lineno">13110</span>  {</div>
+<div class="line"><a name="l13111"></a><span class="lineno">13111</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13112"></a><span class="lineno">13112</span>  }</div>
+<div class="line"><a name="l13113"></a><span class="lineno">13113</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13114"></a><span class="lineno">13114</span>  {</div>
+<div class="line"><a name="l13115"></a><span class="lineno">13115</span>  --srcBlockIndex;</div>
+<div class="line"><a name="l13116"></a><span class="lineno">13116</span>  srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l13117"></a><span class="lineno">13117</span>  }</div>
+<div class="line"><a name="l13118"></a><span class="lineno">13118</span>  }</div>
+<div class="line"><a name="l13119"></a><span class="lineno">13119</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13120"></a><span class="lineno">13120</span>  {</div>
+<div class="line"><a name="l13121"></a><span class="lineno">13121</span>  srcAllocIndex = m_Blocks[srcBlockIndex]->m_Allocations.size() - 1;</div>
+<div class="line"><a name="l13122"></a><span class="lineno">13122</span>  }</div>
+<div class="line"><a name="l13123"></a><span class="lineno">13123</span>  }</div>
+<div class="line"><a name="l13124"></a><span class="lineno">13124</span>  </div>
+<div class="line"><a name="l13125"></a><span class="lineno">13125</span>  BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div>
+<div class="line"><a name="l13126"></a><span class="lineno">13126</span>  AllocationInfo& allocInfo = pSrcBlockInfo->m_Allocations[srcAllocIndex];</div>
+<div class="line"><a name="l13127"></a><span class="lineno">13127</span>  </div>
+<div class="line"><a name="l13128"></a><span class="lineno">13128</span>  <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation->GetSize();</div>
+<div class="line"><a name="l13129"></a><span class="lineno">13129</span>  <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation->GetOffset();</div>
+<div class="line"><a name="l13130"></a><span class="lineno">13130</span>  <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation->GetAlignment();</div>
+<div class="line"><a name="l13131"></a><span class="lineno">13131</span>  <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation->GetSuballocationType();</div>
+<div class="line"><a name="l13132"></a><span class="lineno">13132</span>  </div>
+<div class="line"><a name="l13133"></a><span class="lineno">13133</span>  <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div>
+<div class="line"><a name="l13134"></a><span class="lineno">13134</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex <= srcBlockIndex; ++dstBlockIndex)</div>
+<div class="line"><a name="l13135"></a><span class="lineno">13135</span>  {</div>
+<div class="line"><a name="l13136"></a><span class="lineno">13136</span>  BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div>
+<div class="line"><a name="l13137"></a><span class="lineno">13137</span>  VmaAllocationRequest dstAllocRequest;</div>
+<div class="line"><a name="l13138"></a><span class="lineno">13138</span>  <span class="keywordflow">if</span>(pDstBlockInfo->m_pBlock->m_pMetadata->CreateAllocationRequest(</div>
+<div class="line"><a name="l13139"></a><span class="lineno">13139</span>  m_CurrentFrameIndex,</div>
+<div class="line"><a name="l13140"></a><span class="lineno">13140</span>  m_pBlockVector->GetFrameInUseCount(),</div>
+<div class="line"><a name="l13141"></a><span class="lineno">13141</span>  m_pBlockVector->GetBufferImageGranularity(),</div>
+<div class="line"><a name="l13142"></a><span class="lineno">13142</span>  size,</div>
+<div class="line"><a name="l13143"></a><span class="lineno">13143</span>  alignment,</div>
+<div class="line"><a name="l13144"></a><span class="lineno">13144</span>  <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div>
+<div class="line"><a name="l13145"></a><span class="lineno">13145</span>  suballocType,</div>
+<div class="line"><a name="l13146"></a><span class="lineno">13146</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l13147"></a><span class="lineno">13147</span>  strategy,</div>
+<div class="line"><a name="l13148"></a><span class="lineno">13148</span>  &dstAllocRequest) &&</div>
+<div class="line"><a name="l13149"></a><span class="lineno">13149</span>  MoveMakesSense(</div>
+<div class="line"><a name="l13150"></a><span class="lineno">13150</span>  dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div>
+<div class="line"><a name="l13151"></a><span class="lineno">13151</span>  {</div>
+<div class="line"><a name="l13152"></a><span class="lineno">13152</span>  VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div>
+<div class="line"><a name="l13153"></a><span class="lineno">13153</span>  </div>
+<div class="line"><a name="l13154"></a><span class="lineno">13154</span>  <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div>
+<div class="line"><a name="l13155"></a><span class="lineno">13155</span>  <span class="keywordflow">if</span>((m_AllocationsMoved + 1 > maxAllocationsToMove) ||</div>
+<div class="line"><a name="l13156"></a><span class="lineno">13156</span>  (m_BytesMoved + size > maxBytesToMove))</div>
+<div class="line"><a name="l13157"></a><span class="lineno">13157</span>  {</div>
+<div class="line"><a name="l13158"></a><span class="lineno">13158</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13159"></a><span class="lineno">13159</span>  }</div>
+<div class="line"><a name="l13160"></a><span class="lineno">13160</span>  </div>
+<div class="line"><a name="l13161"></a><span class="lineno">13161</span>  VmaDefragmentationMove move;</div>
+<div class="line"><a name="l13162"></a><span class="lineno">13162</span>  move.srcBlockIndex = pSrcBlockInfo->m_OriginalBlockIndex;</div>
+<div class="line"><a name="l13163"></a><span class="lineno">13163</span>  move.dstBlockIndex = pDstBlockInfo->m_OriginalBlockIndex;</div>
+<div class="line"><a name="l13164"></a><span class="lineno">13164</span>  move.srcOffset = srcOffset;</div>
+<div class="line"><a name="l13165"></a><span class="lineno">13165</span>  move.dstOffset = dstAllocRequest.offset;</div>
+<div class="line"><a name="l13166"></a><span class="lineno">13166</span>  move.size = size;</div>
+<div class="line"><a name="l13167"></a><span class="lineno">13167</span>  moves.push_back(move);</div>
+<div class="line"><a name="l13168"></a><span class="lineno">13168</span>  </div>
+<div class="line"><a name="l13169"></a><span class="lineno">13169</span>  pDstBlockInfo->m_pBlock->m_pMetadata->Alloc(</div>
+<div class="line"><a name="l13170"></a><span class="lineno">13170</span>  dstAllocRequest,</div>
+<div class="line"><a name="l13171"></a><span class="lineno">13171</span>  suballocType,</div>
+<div class="line"><a name="l13172"></a><span class="lineno">13172</span>  size,</div>
+<div class="line"><a name="l13173"></a><span class="lineno">13173</span>  allocInfo.m_hAllocation);</div>
+<div class="line"><a name="l13174"></a><span class="lineno">13174</span>  pSrcBlockInfo->m_pBlock->m_pMetadata->FreeAtOffset(srcOffset);</div>
+<div class="line"><a name="l13175"></a><span class="lineno">13175</span>  </div>
+<div class="line"><a name="l13176"></a><span class="lineno">13176</span>  allocInfo.m_hAllocation->ChangeBlockAllocation(m_hAllocator, pDstBlockInfo->m_pBlock, dstAllocRequest.offset);</div>
+<div class="line"><a name="l13177"></a><span class="lineno">13177</span>  </div>
+<div class="line"><a name="l13178"></a><span class="lineno">13178</span>  <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div>
+<div class="line"><a name="l13179"></a><span class="lineno">13179</span>  {</div>
+<div class="line"><a name="l13180"></a><span class="lineno">13180</span>  *allocInfo.m_pChanged = VK_TRUE;</div>
+<div class="line"><a name="l13181"></a><span class="lineno">13181</span>  }</div>
+<div class="line"><a name="l13182"></a><span class="lineno">13182</span>  </div>
+<div class="line"><a name="l13183"></a><span class="lineno">13183</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13184"></a><span class="lineno">13184</span>  m_BytesMoved += size;</div>
<div class="line"><a name="l13185"></a><span class="lineno">13185</span>  </div>
-<div class="line"><a name="l13186"></a><span class="lineno">13186</span>  <span class="comment">// If not processed, this allocInfo remains in pBlockInfo->m_Allocations for next round.</span></div>
+<div class="line"><a name="l13186"></a><span class="lineno">13186</span>  VmaVectorRemove(pSrcBlockInfo->m_Allocations, srcAllocIndex);</div>
<div class="line"><a name="l13187"></a><span class="lineno">13187</span>  </div>
-<div class="line"><a name="l13188"></a><span class="lineno">13188</span>  <span class="keywordflow">if</span>(srcAllocIndex > 0)</div>
-<div class="line"><a name="l13189"></a><span class="lineno">13189</span>  {</div>
-<div class="line"><a name="l13190"></a><span class="lineno">13190</span>  --srcAllocIndex;</div>
-<div class="line"><a name="l13191"></a><span class="lineno">13191</span>  }</div>
-<div class="line"><a name="l13192"></a><span class="lineno">13192</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13193"></a><span class="lineno">13193</span>  {</div>
-<div class="line"><a name="l13194"></a><span class="lineno">13194</span>  <span class="keywordflow">if</span>(srcBlockIndex > 0)</div>
-<div class="line"><a name="l13195"></a><span class="lineno">13195</span>  {</div>
-<div class="line"><a name="l13196"></a><span class="lineno">13196</span>  --srcBlockIndex;</div>
-<div class="line"><a name="l13197"></a><span class="lineno">13197</span>  srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13198"></a><span class="lineno">13198</span>  }</div>
-<div class="line"><a name="l13199"></a><span class="lineno">13199</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13200"></a><span class="lineno">13200</span>  {</div>
-<div class="line"><a name="l13201"></a><span class="lineno">13201</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13202"></a><span class="lineno">13202</span>  }</div>
-<div class="line"><a name="l13203"></a><span class="lineno">13203</span>  }</div>
-<div class="line"><a name="l13204"></a><span class="lineno">13204</span>  }</div>
-<div class="line"><a name="l13205"></a><span class="lineno">13205</span> }</div>
-<div class="line"><a name="l13206"></a><span class="lineno">13206</span>  </div>
-<div class="line"><a name="l13207"></a><span class="lineno">13207</span> <span class="keywordtype">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div>
-<div class="line"><a name="l13208"></a><span class="lineno">13208</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l13209"></a><span class="lineno">13209</span>  <span class="keywordtype">size_t</span> result = 0;</div>
-<div class="line"><a name="l13210"></a><span class="lineno">13210</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l13211"></a><span class="lineno">13211</span>  {</div>
-<div class="line"><a name="l13212"></a><span class="lineno">13212</span>  <span class="keywordflow">if</span>(m_Blocks[i]->m_HasNonMovableAllocations)</div>
-<div class="line"><a name="l13213"></a><span class="lineno">13213</span>  {</div>
-<div class="line"><a name="l13214"></a><span class="lineno">13214</span>  ++result;</div>
-<div class="line"><a name="l13215"></a><span class="lineno">13215</span>  }</div>
-<div class="line"><a name="l13216"></a><span class="lineno">13216</span>  }</div>
-<div class="line"><a name="l13217"></a><span class="lineno">13217</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l13218"></a><span class="lineno">13218</span> }</div>
-<div class="line"><a name="l13219"></a><span class="lineno">13219</span>  </div>
-<div class="line"><a name="l13220"></a><span class="lineno">13220</span> VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div>
-<div class="line"><a name="l13221"></a><span class="lineno">13221</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
-<div class="line"><a name="l13222"></a><span class="lineno">13222</span>  VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l13223"></a><span class="lineno">13223</span>  uint32_t maxAllocationsToMove)</div>
-<div class="line"><a name="l13224"></a><span class="lineno">13224</span> {</div>
-<div class="line"><a name="l13225"></a><span class="lineno">13225</span>  <span class="keywordflow">if</span>(!m_AllAllocations && m_AllocationCount == 0)</div>
-<div class="line"><a name="l13226"></a><span class="lineno">13226</span>  {</div>
-<div class="line"><a name="l13227"></a><span class="lineno">13227</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13228"></a><span class="lineno">13228</span>  }</div>
-<div class="line"><a name="l13229"></a><span class="lineno">13229</span>  </div>
-<div class="line"><a name="l13230"></a><span class="lineno">13230</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l13231"></a><span class="lineno">13231</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13188"></a><span class="lineno">13188</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13189"></a><span class="lineno">13189</span>  }</div>
+<div class="line"><a name="l13190"></a><span class="lineno">13190</span>  }</div>
+<div class="line"><a name="l13191"></a><span class="lineno">13191</span>  </div>
+<div class="line"><a name="l13192"></a><span class="lineno">13192</span>  <span class="comment">// If not processed, this allocInfo remains in pBlockInfo->m_Allocations for next round.</span></div>
+<div class="line"><a name="l13193"></a><span class="lineno">13193</span>  </div>
+<div class="line"><a name="l13194"></a><span class="lineno">13194</span>  <span class="keywordflow">if</span>(srcAllocIndex > 0)</div>
+<div class="line"><a name="l13195"></a><span class="lineno">13195</span>  {</div>
+<div class="line"><a name="l13196"></a><span class="lineno">13196</span>  --srcAllocIndex;</div>
+<div class="line"><a name="l13197"></a><span class="lineno">13197</span>  }</div>
+<div class="line"><a name="l13198"></a><span class="lineno">13198</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13199"></a><span class="lineno">13199</span>  {</div>
+<div class="line"><a name="l13200"></a><span class="lineno">13200</span>  <span class="keywordflow">if</span>(srcBlockIndex > 0)</div>
+<div class="line"><a name="l13201"></a><span class="lineno">13201</span>  {</div>
+<div class="line"><a name="l13202"></a><span class="lineno">13202</span>  --srcBlockIndex;</div>
+<div class="line"><a name="l13203"></a><span class="lineno">13203</span>  srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l13204"></a><span class="lineno">13204</span>  }</div>
+<div class="line"><a name="l13205"></a><span class="lineno">13205</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13206"></a><span class="lineno">13206</span>  {</div>
+<div class="line"><a name="l13207"></a><span class="lineno">13207</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13208"></a><span class="lineno">13208</span>  }</div>
+<div class="line"><a name="l13209"></a><span class="lineno">13209</span>  }</div>
+<div class="line"><a name="l13210"></a><span class="lineno">13210</span>  }</div>
+<div class="line"><a name="l13211"></a><span class="lineno">13211</span> }</div>
+<div class="line"><a name="l13212"></a><span class="lineno">13212</span>  </div>
+<div class="line"><a name="l13213"></a><span class="lineno">13213</span> <span class="keywordtype">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l13214"></a><span class="lineno">13214</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l13215"></a><span class="lineno">13215</span>  <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l13216"></a><span class="lineno">13216</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l13217"></a><span class="lineno">13217</span>  {</div>
+<div class="line"><a name="l13218"></a><span class="lineno">13218</span>  <span class="keywordflow">if</span>(m_Blocks[i]->m_HasNonMovableAllocations)</div>
+<div class="line"><a name="l13219"></a><span class="lineno">13219</span>  {</div>
+<div class="line"><a name="l13220"></a><span class="lineno">13220</span>  ++result;</div>
+<div class="line"><a name="l13221"></a><span class="lineno">13221</span>  }</div>
+<div class="line"><a name="l13222"></a><span class="lineno">13222</span>  }</div>
+<div class="line"><a name="l13223"></a><span class="lineno">13223</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l13224"></a><span class="lineno">13224</span> }</div>
+<div class="line"><a name="l13225"></a><span class="lineno">13225</span>  </div>
+<div class="line"><a name="l13226"></a><span class="lineno">13226</span> VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div>
+<div class="line"><a name="l13227"></a><span class="lineno">13227</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
+<div class="line"><a name="l13228"></a><span class="lineno">13228</span>  VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l13229"></a><span class="lineno">13229</span>  uint32_t maxAllocationsToMove)</div>
+<div class="line"><a name="l13230"></a><span class="lineno">13230</span> {</div>
+<div class="line"><a name="l13231"></a><span class="lineno">13231</span>  <span class="keywordflow">if</span>(!m_AllAllocations && m_AllocationCount == 0)</div>
<div class="line"><a name="l13232"></a><span class="lineno">13232</span>  {</div>
-<div class="line"><a name="l13233"></a><span class="lineno">13233</span>  BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13234"></a><span class="lineno">13234</span>  </div>
-<div class="line"><a name="l13235"></a><span class="lineno">13235</span>  <span class="keywordflow">if</span>(m_AllAllocations)</div>
-<div class="line"><a name="l13236"></a><span class="lineno">13236</span>  {</div>
-<div class="line"><a name="l13237"></a><span class="lineno">13237</span>  VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo->m_pBlock->m_pMetadata;</div>
-<div class="line"><a name="l13238"></a><span class="lineno">13238</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata->m_Suballocations.begin();</div>
-<div class="line"><a name="l13239"></a><span class="lineno">13239</span>  it != pMetadata->m_Suballocations.end();</div>
-<div class="line"><a name="l13240"></a><span class="lineno">13240</span>  ++it)</div>
-<div class="line"><a name="l13241"></a><span class="lineno">13241</span>  {</div>
-<div class="line"><a name="l13242"></a><span class="lineno">13242</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l13243"></a><span class="lineno">13243</span>  {</div>
-<div class="line"><a name="l13244"></a><span class="lineno">13244</span>  AllocationInfo allocInfo = AllocationInfo(it->hAllocation, VMA_NULL);</div>
-<div class="line"><a name="l13245"></a><span class="lineno">13245</span>  pBlockInfo->m_Allocations.push_back(allocInfo);</div>
-<div class="line"><a name="l13246"></a><span class="lineno">13246</span>  }</div>
-<div class="line"><a name="l13247"></a><span class="lineno">13247</span>  }</div>
-<div class="line"><a name="l13248"></a><span class="lineno">13248</span>  }</div>
-<div class="line"><a name="l13249"></a><span class="lineno">13249</span>  </div>
-<div class="line"><a name="l13250"></a><span class="lineno">13250</span>  pBlockInfo->CalcHasNonMovableAllocations();</div>
-<div class="line"><a name="l13251"></a><span class="lineno">13251</span>  </div>
-<div class="line"><a name="l13252"></a><span class="lineno">13252</span>  <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l13253"></a><span class="lineno">13253</span>  <span class="comment">// Option 1:</span></div>
-<div class="line"><a name="l13254"></a><span class="lineno">13254</span>  pBlockInfo->SortAllocationsByOffsetDescending();</div>
-<div class="line"><a name="l13255"></a><span class="lineno">13255</span>  <span class="comment">// Option 2:</span></div>
-<div class="line"><a name="l13256"></a><span class="lineno">13256</span>  <span class="comment">//pBlockInfo->SortAllocationsBySizeDescending();</span></div>
-<div class="line"><a name="l13257"></a><span class="lineno">13257</span>  }</div>
-<div class="line"><a name="l13258"></a><span class="lineno">13258</span>  </div>
-<div class="line"><a name="l13259"></a><span class="lineno">13259</span>  <span class="comment">// Sort m_Blocks this time by the main criterium, from most "destination" to most "source" blocks.</span></div>
-<div class="line"><a name="l13260"></a><span class="lineno">13260</span>  VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div>
-<div class="line"><a name="l13261"></a><span class="lineno">13261</span>  </div>
-<div class="line"><a name="l13262"></a><span class="lineno">13262</span>  <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l13263"></a><span class="lineno">13263</span>  <span class="keyword">const</span> uint32_t roundCount = 2;</div>
+<div class="line"><a name="l13233"></a><span class="lineno">13233</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13234"></a><span class="lineno">13234</span>  }</div>
+<div class="line"><a name="l13235"></a><span class="lineno">13235</span>  </div>
+<div class="line"><a name="l13236"></a><span class="lineno">13236</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l13237"></a><span class="lineno">13237</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13238"></a><span class="lineno">13238</span>  {</div>
+<div class="line"><a name="l13239"></a><span class="lineno">13239</span>  BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13240"></a><span class="lineno">13240</span>  </div>
+<div class="line"><a name="l13241"></a><span class="lineno">13241</span>  <span class="keywordflow">if</span>(m_AllAllocations)</div>
+<div class="line"><a name="l13242"></a><span class="lineno">13242</span>  {</div>
+<div class="line"><a name="l13243"></a><span class="lineno">13243</span>  VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo->m_pBlock->m_pMetadata;</div>
+<div class="line"><a name="l13244"></a><span class="lineno">13244</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata->m_Suballocations.begin();</div>
+<div class="line"><a name="l13245"></a><span class="lineno">13245</span>  it != pMetadata->m_Suballocations.end();</div>
+<div class="line"><a name="l13246"></a><span class="lineno">13246</span>  ++it)</div>
+<div class="line"><a name="l13247"></a><span class="lineno">13247</span>  {</div>
+<div class="line"><a name="l13248"></a><span class="lineno">13248</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l13249"></a><span class="lineno">13249</span>  {</div>
+<div class="line"><a name="l13250"></a><span class="lineno">13250</span>  AllocationInfo allocInfo = AllocationInfo(it->hAllocation, VMA_NULL);</div>
+<div class="line"><a name="l13251"></a><span class="lineno">13251</span>  pBlockInfo->m_Allocations.push_back(allocInfo);</div>
+<div class="line"><a name="l13252"></a><span class="lineno">13252</span>  }</div>
+<div class="line"><a name="l13253"></a><span class="lineno">13253</span>  }</div>
+<div class="line"><a name="l13254"></a><span class="lineno">13254</span>  }</div>
+<div class="line"><a name="l13255"></a><span class="lineno">13255</span>  </div>
+<div class="line"><a name="l13256"></a><span class="lineno">13256</span>  pBlockInfo->CalcHasNonMovableAllocations();</div>
+<div class="line"><a name="l13257"></a><span class="lineno">13257</span>  </div>
+<div class="line"><a name="l13258"></a><span class="lineno">13258</span>  <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l13259"></a><span class="lineno">13259</span>  <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l13260"></a><span class="lineno">13260</span>  pBlockInfo->SortAllocationsByOffsetDescending();</div>
+<div class="line"><a name="l13261"></a><span class="lineno">13261</span>  <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l13262"></a><span class="lineno">13262</span>  <span class="comment">//pBlockInfo->SortAllocationsBySizeDescending();</span></div>
+<div class="line"><a name="l13263"></a><span class="lineno">13263</span>  }</div>
<div class="line"><a name="l13264"></a><span class="lineno">13264</span>  </div>
-<div class="line"><a name="l13265"></a><span class="lineno">13265</span>  <span class="comment">// Execute defragmentation rounds (the main part).</span></div>
-<div class="line"><a name="l13266"></a><span class="lineno">13266</span>  VkResult result = VK_SUCCESS;</div>
-<div class="line"><a name="l13267"></a><span class="lineno">13267</span>  <span class="keywordflow">for</span>(uint32_t round = 0; (round < roundCount) && (result == VK_SUCCESS); ++round)</div>
-<div class="line"><a name="l13268"></a><span class="lineno">13268</span>  {</div>
-<div class="line"><a name="l13269"></a><span class="lineno">13269</span>  result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove);</div>
-<div class="line"><a name="l13270"></a><span class="lineno">13270</span>  }</div>
-<div class="line"><a name="l13271"></a><span class="lineno">13271</span>  </div>
-<div class="line"><a name="l13272"></a><span class="lineno">13272</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l13273"></a><span class="lineno">13273</span> }</div>
-<div class="line"><a name="l13274"></a><span class="lineno">13274</span>  </div>
-<div class="line"><a name="l13275"></a><span class="lineno">13275</span> <span class="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div>
-<div class="line"><a name="l13276"></a><span class="lineno">13276</span>  <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
-<div class="line"><a name="l13277"></a><span class="lineno">13277</span>  <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div>
-<div class="line"><a name="l13278"></a><span class="lineno">13278</span> {</div>
-<div class="line"><a name="l13279"></a><span class="lineno">13279</span>  <span class="keywordflow">if</span>(dstBlockIndex < srcBlockIndex)</div>
-<div class="line"><a name="l13280"></a><span class="lineno">13280</span>  {</div>
-<div class="line"><a name="l13281"></a><span class="lineno">13281</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13282"></a><span class="lineno">13282</span>  }</div>
-<div class="line"><a name="l13283"></a><span class="lineno">13283</span>  <span class="keywordflow">if</span>(dstBlockIndex > srcBlockIndex)</div>
-<div class="line"><a name="l13284"></a><span class="lineno">13284</span>  {</div>
-<div class="line"><a name="l13285"></a><span class="lineno">13285</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13286"></a><span class="lineno">13286</span>  }</div>
-<div class="line"><a name="l13287"></a><span class="lineno">13287</span>  <span class="keywordflow">if</span>(dstOffset < srcOffset)</div>
-<div class="line"><a name="l13288"></a><span class="lineno">13288</span>  {</div>
-<div class="line"><a name="l13289"></a><span class="lineno">13289</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13290"></a><span class="lineno">13290</span>  }</div>
-<div class="line"><a name="l13291"></a><span class="lineno">13291</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13292"></a><span class="lineno">13292</span> }</div>
-<div class="line"><a name="l13293"></a><span class="lineno">13293</span>  </div>
-<div class="line"><a name="l13295"></a><span class="lineno">13295</span> <span class="comment">// VmaDefragmentationAlgorithm_Fast</span></div>
-<div class="line"><a name="l13296"></a><span class="lineno">13296</span>  </div>
-<div class="line"><a name="l13297"></a><span class="lineno">13297</span> VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div>
-<div class="line"><a name="l13298"></a><span class="lineno">13298</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l13299"></a><span class="lineno">13299</span>  VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l13300"></a><span class="lineno">13300</span>  uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l13301"></a><span class="lineno">13301</span>  <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
-<div class="line"><a name="l13302"></a><span class="lineno">13302</span>  VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
-<div class="line"><a name="l13303"></a><span class="lineno">13303</span>  m_OverlappingMoveSupported(overlappingMoveSupported),</div>
-<div class="line"><a name="l13304"></a><span class="lineno">13304</span>  m_AllocationCount(0),</div>
-<div class="line"><a name="l13305"></a><span class="lineno">13305</span>  m_AllAllocations(false),</div>
-<div class="line"><a name="l13306"></a><span class="lineno">13306</span>  m_BytesMoved(0),</div>
-<div class="line"><a name="l13307"></a><span class="lineno">13307</span>  m_AllocationsMoved(0),</div>
-<div class="line"><a name="l13308"></a><span class="lineno">13308</span>  m_BlockInfos(VmaStlAllocator<BlockInfo>(hAllocator->GetAllocationCallbacks()))</div>
-<div class="line"><a name="l13309"></a><span class="lineno">13309</span> {</div>
-<div class="line"><a name="l13310"></a><span class="lineno">13310</span>  VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</div>
-<div class="line"><a name="l13311"></a><span class="lineno">13311</span>  </div>
-<div class="line"><a name="l13312"></a><span class="lineno">13312</span> }</div>
-<div class="line"><a name="l13313"></a><span class="lineno">13313</span>  </div>
-<div class="line"><a name="l13314"></a><span class="lineno">13314</span> VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</div>
+<div class="line"><a name="l13265"></a><span class="lineno">13265</span>  <span class="comment">// Sort m_Blocks this time by the main criterium, from most "destination" to most "source" blocks.</span></div>
+<div class="line"><a name="l13266"></a><span class="lineno">13266</span>  VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div>
+<div class="line"><a name="l13267"></a><span class="lineno">13267</span>  </div>
+<div class="line"><a name="l13268"></a><span class="lineno">13268</span>  <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l13269"></a><span class="lineno">13269</span>  <span class="keyword">const</span> uint32_t roundCount = 2;</div>
+<div class="line"><a name="l13270"></a><span class="lineno">13270</span>  </div>
+<div class="line"><a name="l13271"></a><span class="lineno">13271</span>  <span class="comment">// Execute defragmentation rounds (the main part).</span></div>
+<div class="line"><a name="l13272"></a><span class="lineno">13272</span>  VkResult result = VK_SUCCESS;</div>
+<div class="line"><a name="l13273"></a><span class="lineno">13273</span>  <span class="keywordflow">for</span>(uint32_t round = 0; (round < roundCount) && (result == VK_SUCCESS); ++round)</div>
+<div class="line"><a name="l13274"></a><span class="lineno">13274</span>  {</div>
+<div class="line"><a name="l13275"></a><span class="lineno">13275</span>  result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove);</div>
+<div class="line"><a name="l13276"></a><span class="lineno">13276</span>  }</div>
+<div class="line"><a name="l13277"></a><span class="lineno">13277</span>  </div>
+<div class="line"><a name="l13278"></a><span class="lineno">13278</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l13279"></a><span class="lineno">13279</span> }</div>
+<div class="line"><a name="l13280"></a><span class="lineno">13280</span>  </div>
+<div class="line"><a name="l13281"></a><span class="lineno">13281</span> <span class="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div>
+<div class="line"><a name="l13282"></a><span class="lineno">13282</span>  <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
+<div class="line"><a name="l13283"></a><span class="lineno">13283</span>  <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div>
+<div class="line"><a name="l13284"></a><span class="lineno">13284</span> {</div>
+<div class="line"><a name="l13285"></a><span class="lineno">13285</span>  <span class="keywordflow">if</span>(dstBlockIndex < srcBlockIndex)</div>
+<div class="line"><a name="l13286"></a><span class="lineno">13286</span>  {</div>
+<div class="line"><a name="l13287"></a><span class="lineno">13287</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l13288"></a><span class="lineno">13288</span>  }</div>
+<div class="line"><a name="l13289"></a><span class="lineno">13289</span>  <span class="keywordflow">if</span>(dstBlockIndex > srcBlockIndex)</div>
+<div class="line"><a name="l13290"></a><span class="lineno">13290</span>  {</div>
+<div class="line"><a name="l13291"></a><span class="lineno">13291</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13292"></a><span class="lineno">13292</span>  }</div>
+<div class="line"><a name="l13293"></a><span class="lineno">13293</span>  <span class="keywordflow">if</span>(dstOffset < srcOffset)</div>
+<div class="line"><a name="l13294"></a><span class="lineno">13294</span>  {</div>
+<div class="line"><a name="l13295"></a><span class="lineno">13295</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l13296"></a><span class="lineno">13296</span>  }</div>
+<div class="line"><a name="l13297"></a><span class="lineno">13297</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13298"></a><span class="lineno">13298</span> }</div>
+<div class="line"><a name="l13299"></a><span class="lineno">13299</span>  </div>
+<div class="line"><a name="l13301"></a><span class="lineno">13301</span> <span class="comment">// VmaDefragmentationAlgorithm_Fast</span></div>
+<div class="line"><a name="l13302"></a><span class="lineno">13302</span>  </div>
+<div class="line"><a name="l13303"></a><span class="lineno">13303</span> VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div>
+<div class="line"><a name="l13304"></a><span class="lineno">13304</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13305"></a><span class="lineno">13305</span>  VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l13306"></a><span class="lineno">13306</span>  uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l13307"></a><span class="lineno">13307</span>  <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l13308"></a><span class="lineno">13308</span>  VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l13309"></a><span class="lineno">13309</span>  m_OverlappingMoveSupported(overlappingMoveSupported),</div>
+<div class="line"><a name="l13310"></a><span class="lineno">13310</span>  m_AllocationCount(0),</div>
+<div class="line"><a name="l13311"></a><span class="lineno">13311</span>  m_AllAllocations(false),</div>
+<div class="line"><a name="l13312"></a><span class="lineno">13312</span>  m_BytesMoved(0),</div>
+<div class="line"><a name="l13313"></a><span class="lineno">13313</span>  m_AllocationsMoved(0),</div>
+<div class="line"><a name="l13314"></a><span class="lineno">13314</span>  m_BlockInfos(VmaStlAllocator<BlockInfo>(hAllocator->GetAllocationCallbacks()))</div>
<div class="line"><a name="l13315"></a><span class="lineno">13315</span> {</div>
-<div class="line"><a name="l13316"></a><span class="lineno">13316</span> }</div>
+<div class="line"><a name="l13316"></a><span class="lineno">13316</span>  VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</div>
<div class="line"><a name="l13317"></a><span class="lineno">13317</span>  </div>
-<div class="line"><a name="l13318"></a><span class="lineno">13318</span> VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div>
-<div class="line"><a name="l13319"></a><span class="lineno">13319</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
-<div class="line"><a name="l13320"></a><span class="lineno">13320</span>  VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l13321"></a><span class="lineno">13321</span>  uint32_t maxAllocationsToMove)</div>
-<div class="line"><a name="l13322"></a><span class="lineno">13322</span> {</div>
-<div class="line"><a name="l13323"></a><span class="lineno">13323</span>  VMA_ASSERT(m_AllAllocations || m_pBlockVector->CalcAllocationCount() == m_AllocationCount);</div>
-<div class="line"><a name="l13324"></a><span class="lineno">13324</span>  </div>
-<div class="line"><a name="l13325"></a><span class="lineno">13325</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
-<div class="line"><a name="l13326"></a><span class="lineno">13326</span>  <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</div>
-<div class="line"><a name="l13327"></a><span class="lineno">13327</span>  {</div>
-<div class="line"><a name="l13328"></a><span class="lineno">13328</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13329"></a><span class="lineno">13329</span>  }</div>
+<div class="line"><a name="l13318"></a><span class="lineno">13318</span> }</div>
+<div class="line"><a name="l13319"></a><span class="lineno">13319</span>  </div>
+<div class="line"><a name="l13320"></a><span class="lineno">13320</span> VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</div>
+<div class="line"><a name="l13321"></a><span class="lineno">13321</span> {</div>
+<div class="line"><a name="l13322"></a><span class="lineno">13322</span> }</div>
+<div class="line"><a name="l13323"></a><span class="lineno">13323</span>  </div>
+<div class="line"><a name="l13324"></a><span class="lineno">13324</span> VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div>
+<div class="line"><a name="l13325"></a><span class="lineno">13325</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div>
+<div class="line"><a name="l13326"></a><span class="lineno">13326</span>  VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l13327"></a><span class="lineno">13327</span>  uint32_t maxAllocationsToMove)</div>
+<div class="line"><a name="l13328"></a><span class="lineno">13328</span> {</div>
+<div class="line"><a name="l13329"></a><span class="lineno">13329</span>  VMA_ASSERT(m_AllAllocations || m_pBlockVector->CalcAllocationCount() == m_AllocationCount);</div>
<div class="line"><a name="l13330"></a><span class="lineno">13330</span>  </div>
-<div class="line"><a name="l13331"></a><span class="lineno">13331</span>  PreprocessMetadata();</div>
-<div class="line"><a name="l13332"></a><span class="lineno">13332</span>  </div>
-<div class="line"><a name="l13333"></a><span class="lineno">13333</span>  <span class="comment">// Sort blocks in order from most destination.</span></div>
-<div class="line"><a name="l13334"></a><span class="lineno">13334</span>  </div>
-<div class="line"><a name="l13335"></a><span class="lineno">13335</span>  m_BlockInfos.resize(blockCount);</div>
-<div class="line"><a name="l13336"></a><span class="lineno">13336</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < blockCount; ++i)</div>
-<div class="line"><a name="l13337"></a><span class="lineno">13337</span>  {</div>
-<div class="line"><a name="l13338"></a><span class="lineno">13338</span>  m_BlockInfos[i].origBlockIndex = i;</div>
-<div class="line"><a name="l13339"></a><span class="lineno">13339</span>  }</div>
+<div class="line"><a name="l13331"></a><span class="lineno">13331</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
+<div class="line"><a name="l13332"></a><span class="lineno">13332</span>  <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</div>
+<div class="line"><a name="l13333"></a><span class="lineno">13333</span>  {</div>
+<div class="line"><a name="l13334"></a><span class="lineno">13334</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13335"></a><span class="lineno">13335</span>  }</div>
+<div class="line"><a name="l13336"></a><span class="lineno">13336</span>  </div>
+<div class="line"><a name="l13337"></a><span class="lineno">13337</span>  PreprocessMetadata();</div>
+<div class="line"><a name="l13338"></a><span class="lineno">13338</span>  </div>
+<div class="line"><a name="l13339"></a><span class="lineno">13339</span>  <span class="comment">// Sort blocks in order from most destination.</span></div>
<div class="line"><a name="l13340"></a><span class="lineno">13340</span>  </div>
-<div class="line"><a name="l13341"></a><span class="lineno">13341</span>  VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo& lhs, <span class="keyword">const</span> BlockInfo& rhs) -> <span class="keywordtype">bool</span> {</div>
-<div class="line"><a name="l13342"></a><span class="lineno">13342</span>  <span class="keywordflow">return</span> m_pBlockVector->GetBlock(lhs.origBlockIndex)->m_pMetadata->GetSumFreeSize() <</div>
-<div class="line"><a name="l13343"></a><span class="lineno">13343</span>  m_pBlockVector->GetBlock(rhs.origBlockIndex)->m_pMetadata->GetSumFreeSize();</div>
-<div class="line"><a name="l13344"></a><span class="lineno">13344</span>  });</div>
-<div class="line"><a name="l13345"></a><span class="lineno">13345</span>  </div>
-<div class="line"><a name="l13346"></a><span class="lineno">13346</span>  <span class="comment">// THE MAIN ALGORITHM</span></div>
-<div class="line"><a name="l13347"></a><span class="lineno">13347</span>  </div>
-<div class="line"><a name="l13348"></a><span class="lineno">13348</span>  FreeSpaceDatabase freeSpaceDb;</div>
-<div class="line"><a name="l13349"></a><span class="lineno">13349</span>  </div>
-<div class="line"><a name="l13350"></a><span class="lineno">13350</span>  <span class="keywordtype">size_t</span> dstBlockInfoIndex = 0;</div>
-<div class="line"><a name="l13351"></a><span class="lineno">13351</span>  <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l13352"></a><span class="lineno">13352</span>  VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector->GetBlock(dstOrigBlockIndex);</div>
-<div class="line"><a name="l13353"></a><span class="lineno">13353</span>  VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock->m_pMetadata;</div>
-<div class="line"><a name="l13354"></a><span class="lineno">13354</span>  VkDeviceSize dstBlockSize = pDstMetadata->GetSize();</div>
-<div class="line"><a name="l13355"></a><span class="lineno">13355</span>  VkDeviceSize dstOffset = 0;</div>
-<div class="line"><a name="l13356"></a><span class="lineno">13356</span>  </div>
-<div class="line"><a name="l13357"></a><span class="lineno">13357</span>  <span class="keywordtype">bool</span> end = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13358"></a><span class="lineno">13358</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end && srcBlockInfoIndex < blockCount; ++srcBlockInfoIndex)</div>
-<div class="line"><a name="l13359"></a><span class="lineno">13359</span>  {</div>
-<div class="line"><a name="l13360"></a><span class="lineno">13360</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l13361"></a><span class="lineno">13361</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector->GetBlock(srcOrigBlockIndex);</div>
-<div class="line"><a name="l13362"></a><span class="lineno">13362</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock->m_pMetadata;</div>
-<div class="line"><a name="l13363"></a><span class="lineno">13363</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata->m_Suballocations.begin();</div>
-<div class="line"><a name="l13364"></a><span class="lineno">13364</span>  !end && srcSuballocIt != pSrcMetadata->m_Suballocations.end(); )</div>
-<div class="line"><a name="l13365"></a><span class="lineno">13365</span>  {</div>
-<div class="line"><a name="l13366"></a><span class="lineno">13366</span>  VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt->hAllocation;</div>
-<div class="line"><a name="l13367"></a><span class="lineno">13367</span>  <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc->GetAlignment();</div>
-<div class="line"><a name="l13368"></a><span class="lineno">13368</span>  <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt->size;</div>
-<div class="line"><a name="l13369"></a><span class="lineno">13369</span>  <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div>
-<div class="line"><a name="l13370"></a><span class="lineno">13370</span>  m_BytesMoved + srcAllocSize > maxBytesToMove)</div>
-<div class="line"><a name="l13371"></a><span class="lineno">13371</span>  {</div>
-<div class="line"><a name="l13372"></a><span class="lineno">13372</span>  end = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13373"></a><span class="lineno">13373</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13374"></a><span class="lineno">13374</span>  }</div>
-<div class="line"><a name="l13375"></a><span class="lineno">13375</span>  <span class="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt->offset;</div>
-<div class="line"><a name="l13376"></a><span class="lineno">13376</span>  </div>
-<div class="line"><a name="l13377"></a><span class="lineno">13377</span>  <span class="comment">// Try to place it in one of free spaces from the database.</span></div>
-<div class="line"><a name="l13378"></a><span class="lineno">13378</span>  <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div>
-<div class="line"><a name="l13379"></a><span class="lineno">13379</span>  VkDeviceSize dstAllocOffset;</div>
-<div class="line"><a name="l13380"></a><span class="lineno">13380</span>  <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div>
-<div class="line"><a name="l13381"></a><span class="lineno">13381</span>  freeSpaceInfoIndex, dstAllocOffset))</div>
-<div class="line"><a name="l13382"></a><span class="lineno">13382</span>  {</div>
-<div class="line"><a name="l13383"></a><span class="lineno">13383</span>  <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l13384"></a><span class="lineno">13384</span>  VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector->GetBlock(freeSpaceOrigBlockIndex);</div>
-<div class="line"><a name="l13385"></a><span class="lineno">13385</span>  VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock->m_pMetadata;</div>
-<div class="line"><a name="l13386"></a><span class="lineno">13386</span>  </div>
-<div class="line"><a name="l13387"></a><span class="lineno">13387</span>  <span class="comment">// Same block</span></div>
-<div class="line"><a name="l13388"></a><span class="lineno">13388</span>  <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div>
-<div class="line"><a name="l13389"></a><span class="lineno">13389</span>  {</div>
-<div class="line"><a name="l13390"></a><span class="lineno">13390</span>  VMA_ASSERT(dstAllocOffset <= srcAllocOffset);</div>
-<div class="line"><a name="l13391"></a><span class="lineno">13391</span>  </div>
-<div class="line"><a name="l13392"></a><span class="lineno">13392</span>  <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
-<div class="line"><a name="l13393"></a><span class="lineno">13393</span>  </div>
-<div class="line"><a name="l13394"></a><span class="lineno">13394</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l13395"></a><span class="lineno">13395</span>  suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l13396"></a><span class="lineno">13396</span>  suballoc.hAllocation->ChangeOffset(dstAllocOffset);</div>
-<div class="line"><a name="l13397"></a><span class="lineno">13397</span>  m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l13398"></a><span class="lineno">13398</span>  ++m_AllocationsMoved;</div>
-<div class="line"><a name="l13399"></a><span class="lineno">13399</span>  </div>
-<div class="line"><a name="l13400"></a><span class="lineno">13400</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l13401"></a><span class="lineno">13401</span>  ++nextSuballocIt;</div>
-<div class="line"><a name="l13402"></a><span class="lineno">13402</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l13403"></a><span class="lineno">13403</span>  srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l13404"></a><span class="lineno">13404</span>  </div>
-<div class="line"><a name="l13405"></a><span class="lineno">13405</span>  InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
-<div class="line"><a name="l13406"></a><span class="lineno">13406</span>  </div>
-<div class="line"><a name="l13407"></a><span class="lineno">13407</span>  VmaDefragmentationMove move = {</div>
-<div class="line"><a name="l13408"></a><span class="lineno">13408</span>  srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
-<div class="line"><a name="l13409"></a><span class="lineno">13409</span>  srcAllocOffset, dstAllocOffset,</div>
-<div class="line"><a name="l13410"></a><span class="lineno">13410</span>  srcAllocSize };</div>
-<div class="line"><a name="l13411"></a><span class="lineno">13411</span>  moves.push_back(move);</div>
-<div class="line"><a name="l13412"></a><span class="lineno">13412</span>  }</div>
-<div class="line"><a name="l13413"></a><span class="lineno">13413</span>  <span class="comment">// Different block</span></div>
-<div class="line"><a name="l13414"></a><span class="lineno">13414</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13415"></a><span class="lineno">13415</span>  {</div>
-<div class="line"><a name="l13416"></a><span class="lineno">13416</span>  <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
-<div class="line"><a name="l13417"></a><span class="lineno">13417</span>  </div>
-<div class="line"><a name="l13418"></a><span class="lineno">13418</span>  VMA_ASSERT(freeSpaceInfoIndex < srcBlockInfoIndex);</div>
-<div class="line"><a name="l13419"></a><span class="lineno">13419</span>  </div>
-<div class="line"><a name="l13420"></a><span class="lineno">13420</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l13421"></a><span class="lineno">13421</span>  suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l13422"></a><span class="lineno">13422</span>  suballoc.hAllocation->ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div>
-<div class="line"><a name="l13423"></a><span class="lineno">13423</span>  m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l13424"></a><span class="lineno">13424</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13341"></a><span class="lineno">13341</span>  m_BlockInfos.resize(blockCount);</div>
+<div class="line"><a name="l13342"></a><span class="lineno">13342</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < blockCount; ++i)</div>
+<div class="line"><a name="l13343"></a><span class="lineno">13343</span>  {</div>
+<div class="line"><a name="l13344"></a><span class="lineno">13344</span>  m_BlockInfos[i].origBlockIndex = i;</div>
+<div class="line"><a name="l13345"></a><span class="lineno">13345</span>  }</div>
+<div class="line"><a name="l13346"></a><span class="lineno">13346</span>  </div>
+<div class="line"><a name="l13347"></a><span class="lineno">13347</span>  VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo& lhs, <span class="keyword">const</span> BlockInfo& rhs) -> <span class="keywordtype">bool</span> {</div>
+<div class="line"><a name="l13348"></a><span class="lineno">13348</span>  <span class="keywordflow">return</span> m_pBlockVector->GetBlock(lhs.origBlockIndex)->m_pMetadata->GetSumFreeSize() <</div>
+<div class="line"><a name="l13349"></a><span class="lineno">13349</span>  m_pBlockVector->GetBlock(rhs.origBlockIndex)->m_pMetadata->GetSumFreeSize();</div>
+<div class="line"><a name="l13350"></a><span class="lineno">13350</span>  });</div>
+<div class="line"><a name="l13351"></a><span class="lineno">13351</span>  </div>
+<div class="line"><a name="l13352"></a><span class="lineno">13352</span>  <span class="comment">// THE MAIN ALGORITHM</span></div>
+<div class="line"><a name="l13353"></a><span class="lineno">13353</span>  </div>
+<div class="line"><a name="l13354"></a><span class="lineno">13354</span>  FreeSpaceDatabase freeSpaceDb;</div>
+<div class="line"><a name="l13355"></a><span class="lineno">13355</span>  </div>
+<div class="line"><a name="l13356"></a><span class="lineno">13356</span>  <span class="keywordtype">size_t</span> dstBlockInfoIndex = 0;</div>
+<div class="line"><a name="l13357"></a><span class="lineno">13357</span>  <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13358"></a><span class="lineno">13358</span>  VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector->GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l13359"></a><span class="lineno">13359</span>  VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock->m_pMetadata;</div>
+<div class="line"><a name="l13360"></a><span class="lineno">13360</span>  VkDeviceSize dstBlockSize = pDstMetadata->GetSize();</div>
+<div class="line"><a name="l13361"></a><span class="lineno">13361</span>  VkDeviceSize dstOffset = 0;</div>
+<div class="line"><a name="l13362"></a><span class="lineno">13362</span>  </div>
+<div class="line"><a name="l13363"></a><span class="lineno">13363</span>  <span class="keywordtype">bool</span> end = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13364"></a><span class="lineno">13364</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end && srcBlockInfoIndex < blockCount; ++srcBlockInfoIndex)</div>
+<div class="line"><a name="l13365"></a><span class="lineno">13365</span>  {</div>
+<div class="line"><a name="l13366"></a><span class="lineno">13366</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13367"></a><span class="lineno">13367</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector->GetBlock(srcOrigBlockIndex);</div>
+<div class="line"><a name="l13368"></a><span class="lineno">13368</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock->m_pMetadata;</div>
+<div class="line"><a name="l13369"></a><span class="lineno">13369</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata->m_Suballocations.begin();</div>
+<div class="line"><a name="l13370"></a><span class="lineno">13370</span>  !end && srcSuballocIt != pSrcMetadata->m_Suballocations.end(); )</div>
+<div class="line"><a name="l13371"></a><span class="lineno">13371</span>  {</div>
+<div class="line"><a name="l13372"></a><span class="lineno">13372</span>  VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt->hAllocation;</div>
+<div class="line"><a name="l13373"></a><span class="lineno">13373</span>  <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc->GetAlignment();</div>
+<div class="line"><a name="l13374"></a><span class="lineno">13374</span>  <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt->size;</div>
+<div class="line"><a name="l13375"></a><span class="lineno">13375</span>  <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div>
+<div class="line"><a name="l13376"></a><span class="lineno">13376</span>  m_BytesMoved + srcAllocSize > maxBytesToMove)</div>
+<div class="line"><a name="l13377"></a><span class="lineno">13377</span>  {</div>
+<div class="line"><a name="l13378"></a><span class="lineno">13378</span>  end = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l13379"></a><span class="lineno">13379</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13380"></a><span class="lineno">13380</span>  }</div>
+<div class="line"><a name="l13381"></a><span class="lineno">13381</span>  <span class="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt->offset;</div>
+<div class="line"><a name="l13382"></a><span class="lineno">13382</span>  </div>
+<div class="line"><a name="l13383"></a><span class="lineno">13383</span>  <span class="comment">// Try to place it in one of free spaces from the database.</span></div>
+<div class="line"><a name="l13384"></a><span class="lineno">13384</span>  <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div>
+<div class="line"><a name="l13385"></a><span class="lineno">13385</span>  VkDeviceSize dstAllocOffset;</div>
+<div class="line"><a name="l13386"></a><span class="lineno">13386</span>  <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div>
+<div class="line"><a name="l13387"></a><span class="lineno">13387</span>  freeSpaceInfoIndex, dstAllocOffset))</div>
+<div class="line"><a name="l13388"></a><span class="lineno">13388</span>  {</div>
+<div class="line"><a name="l13389"></a><span class="lineno">13389</span>  <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13390"></a><span class="lineno">13390</span>  VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector->GetBlock(freeSpaceOrigBlockIndex);</div>
+<div class="line"><a name="l13391"></a><span class="lineno">13391</span>  VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock->m_pMetadata;</div>
+<div class="line"><a name="l13392"></a><span class="lineno">13392</span>  </div>
+<div class="line"><a name="l13393"></a><span class="lineno">13393</span>  <span class="comment">// Same block</span></div>
+<div class="line"><a name="l13394"></a><span class="lineno">13394</span>  <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l13395"></a><span class="lineno">13395</span>  {</div>
+<div class="line"><a name="l13396"></a><span class="lineno">13396</span>  VMA_ASSERT(dstAllocOffset <= srcAllocOffset);</div>
+<div class="line"><a name="l13397"></a><span class="lineno">13397</span>  </div>
+<div class="line"><a name="l13398"></a><span class="lineno">13398</span>  <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
+<div class="line"><a name="l13399"></a><span class="lineno">13399</span>  </div>
+<div class="line"><a name="l13400"></a><span class="lineno">13400</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13401"></a><span class="lineno">13401</span>  suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13402"></a><span class="lineno">13402</span>  suballoc.hAllocation->ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l13403"></a><span class="lineno">13403</span>  m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13404"></a><span class="lineno">13404</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13405"></a><span class="lineno">13405</span>  </div>
+<div class="line"><a name="l13406"></a><span class="lineno">13406</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13407"></a><span class="lineno">13407</span>  ++nextSuballocIt;</div>
+<div class="line"><a name="l13408"></a><span class="lineno">13408</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13409"></a><span class="lineno">13409</span>  srcSuballocIt = nextSuballocIt;</div>
+<div class="line"><a name="l13410"></a><span class="lineno">13410</span>  </div>
+<div class="line"><a name="l13411"></a><span class="lineno">13411</span>  InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
+<div class="line"><a name="l13412"></a><span class="lineno">13412</span>  </div>
+<div class="line"><a name="l13413"></a><span class="lineno">13413</span>  VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13414"></a><span class="lineno">13414</span>  srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
+<div class="line"><a name="l13415"></a><span class="lineno">13415</span>  srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13416"></a><span class="lineno">13416</span>  srcAllocSize };</div>
+<div class="line"><a name="l13417"></a><span class="lineno">13417</span>  moves.push_back(move);</div>
+<div class="line"><a name="l13418"></a><span class="lineno">13418</span>  }</div>
+<div class="line"><a name="l13419"></a><span class="lineno">13419</span>  <span class="comment">// Different block</span></div>
+<div class="line"><a name="l13420"></a><span class="lineno">13420</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13421"></a><span class="lineno">13421</span>  {</div>
+<div class="line"><a name="l13422"></a><span class="lineno">13422</span>  <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l13423"></a><span class="lineno">13423</span>  </div>
+<div class="line"><a name="l13424"></a><span class="lineno">13424</span>  VMA_ASSERT(freeSpaceInfoIndex < srcBlockInfoIndex);</div>
<div class="line"><a name="l13425"></a><span class="lineno">13425</span>  </div>
-<div class="line"><a name="l13426"></a><span class="lineno">13426</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l13427"></a><span class="lineno">13427</span>  ++nextSuballocIt;</div>
-<div class="line"><a name="l13428"></a><span class="lineno">13428</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l13429"></a><span class="lineno">13429</span>  srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l13430"></a><span class="lineno">13430</span>  </div>
-<div class="line"><a name="l13431"></a><span class="lineno">13431</span>  InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
-<div class="line"><a name="l13432"></a><span class="lineno">13432</span>  </div>
-<div class="line"><a name="l13433"></a><span class="lineno">13433</span>  VmaDefragmentationMove move = {</div>
-<div class="line"><a name="l13434"></a><span class="lineno">13434</span>  srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
-<div class="line"><a name="l13435"></a><span class="lineno">13435</span>  srcAllocOffset, dstAllocOffset,</div>
-<div class="line"><a name="l13436"></a><span class="lineno">13436</span>  srcAllocSize };</div>
-<div class="line"><a name="l13437"></a><span class="lineno">13437</span>  moves.push_back(move);</div>
-<div class="line"><a name="l13438"></a><span class="lineno">13438</span>  }</div>
-<div class="line"><a name="l13439"></a><span class="lineno">13439</span>  }</div>
-<div class="line"><a name="l13440"></a><span class="lineno">13440</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13441"></a><span class="lineno">13441</span>  {</div>
-<div class="line"><a name="l13442"></a><span class="lineno">13442</span>  dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</div>
-<div class="line"><a name="l13443"></a><span class="lineno">13443</span>  </div>
-<div class="line"><a name="l13444"></a><span class="lineno">13444</span>  <span class="comment">// If the allocation doesn't fit before the end of dstBlock, forward to next block.</span></div>
-<div class="line"><a name="l13445"></a><span class="lineno">13445</span>  <span class="keywordflow">while</span>(dstBlockInfoIndex < srcBlockInfoIndex &&</div>
-<div class="line"><a name="l13446"></a><span class="lineno">13446</span>  dstAllocOffset + srcAllocSize > dstBlockSize)</div>
-<div class="line"><a name="l13447"></a><span class="lineno">13447</span>  {</div>
-<div class="line"><a name="l13448"></a><span class="lineno">13448</span>  <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div>
-<div class="line"><a name="l13449"></a><span class="lineno">13449</span>  freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</div>
-<div class="line"><a name="l13450"></a><span class="lineno">13450</span>  </div>
-<div class="line"><a name="l13451"></a><span class="lineno">13451</span>  ++dstBlockInfoIndex;</div>
-<div class="line"><a name="l13452"></a><span class="lineno">13452</span>  dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l13453"></a><span class="lineno">13453</span>  pDstBlock = m_pBlockVector->GetBlock(dstOrigBlockIndex);</div>
-<div class="line"><a name="l13454"></a><span class="lineno">13454</span>  pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock->m_pMetadata;</div>
-<div class="line"><a name="l13455"></a><span class="lineno">13455</span>  dstBlockSize = pDstMetadata->GetSize();</div>
-<div class="line"><a name="l13456"></a><span class="lineno">13456</span>  dstOffset = 0;</div>
-<div class="line"><a name="l13457"></a><span class="lineno">13457</span>  dstAllocOffset = 0;</div>
-<div class="line"><a name="l13458"></a><span class="lineno">13458</span>  }</div>
-<div class="line"><a name="l13459"></a><span class="lineno">13459</span>  </div>
-<div class="line"><a name="l13460"></a><span class="lineno">13460</span>  <span class="comment">// Same block</span></div>
-<div class="line"><a name="l13461"></a><span class="lineno">13461</span>  <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</div>
-<div class="line"><a name="l13462"></a><span class="lineno">13462</span>  {</div>
-<div class="line"><a name="l13463"></a><span class="lineno">13463</span>  VMA_ASSERT(dstAllocOffset <= srcAllocOffset);</div>
-<div class="line"><a name="l13464"></a><span class="lineno">13464</span>  </div>
-<div class="line"><a name="l13465"></a><span class="lineno">13465</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize > srcAllocOffset;</div>
-<div class="line"><a name="l13466"></a><span class="lineno">13466</span>  </div>
-<div class="line"><a name="l13467"></a><span class="lineno">13467</span>  <span class="keywordtype">bool</span> skipOver = overlap;</div>
-<div class="line"><a name="l13468"></a><span class="lineno">13468</span>  <span class="keywordflow">if</span>(overlap && m_OverlappingMoveSupported && dstAllocOffset < srcAllocOffset)</div>
-<div class="line"><a name="l13469"></a><span class="lineno">13469</span>  {</div>
-<div class="line"><a name="l13470"></a><span class="lineno">13470</span>  <span class="comment">// If destination and source place overlap, skip if it would move it</span></div>
-<div class="line"><a name="l13471"></a><span class="lineno">13471</span>  <span class="comment">// by only < 1/64 of its size.</span></div>
-<div class="line"><a name="l13472"></a><span class="lineno">13472</span>  skipOver = (srcAllocOffset - dstAllocOffset) * 64 < srcAllocSize;</div>
-<div class="line"><a name="l13473"></a><span class="lineno">13473</span>  }</div>
-<div class="line"><a name="l13474"></a><span class="lineno">13474</span>  </div>
-<div class="line"><a name="l13475"></a><span class="lineno">13475</span>  <span class="keywordflow">if</span>(skipOver)</div>
-<div class="line"><a name="l13476"></a><span class="lineno">13476</span>  {</div>
-<div class="line"><a name="l13477"></a><span class="lineno">13477</span>  freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</div>
-<div class="line"><a name="l13478"></a><span class="lineno">13478</span>  </div>
-<div class="line"><a name="l13479"></a><span class="lineno">13479</span>  dstOffset = srcAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l13480"></a><span class="lineno">13480</span>  ++srcSuballocIt;</div>
-<div class="line"><a name="l13481"></a><span class="lineno">13481</span>  }</div>
-<div class="line"><a name="l13482"></a><span class="lineno">13482</span>  <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
-<div class="line"><a name="l13483"></a><span class="lineno">13483</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13484"></a><span class="lineno">13484</span>  {</div>
-<div class="line"><a name="l13485"></a><span class="lineno">13485</span>  srcSuballocIt->offset = dstAllocOffset;</div>
-<div class="line"><a name="l13486"></a><span class="lineno">13486</span>  srcSuballocIt->hAllocation->ChangeOffset(dstAllocOffset);</div>
-<div class="line"><a name="l13487"></a><span class="lineno">13487</span>  dstOffset = dstAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l13488"></a><span class="lineno">13488</span>  m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l13489"></a><span class="lineno">13489</span>  ++m_AllocationsMoved;</div>
-<div class="line"><a name="l13490"></a><span class="lineno">13490</span>  ++srcSuballocIt;</div>
-<div class="line"><a name="l13491"></a><span class="lineno">13491</span>  VmaDefragmentationMove move = {</div>
-<div class="line"><a name="l13492"></a><span class="lineno">13492</span>  srcOrigBlockIndex, dstOrigBlockIndex,</div>
-<div class="line"><a name="l13493"></a><span class="lineno">13493</span>  srcAllocOffset, dstAllocOffset,</div>
-<div class="line"><a name="l13494"></a><span class="lineno">13494</span>  srcAllocSize };</div>
-<div class="line"><a name="l13495"></a><span class="lineno">13495</span>  moves.push_back(move);</div>
-<div class="line"><a name="l13496"></a><span class="lineno">13496</span>  }</div>
-<div class="line"><a name="l13497"></a><span class="lineno">13497</span>  }</div>
-<div class="line"><a name="l13498"></a><span class="lineno">13498</span>  <span class="comment">// Different block</span></div>
-<div class="line"><a name="l13499"></a><span class="lineno">13499</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13500"></a><span class="lineno">13500</span>  {</div>
-<div class="line"><a name="l13501"></a><span class="lineno">13501</span>  <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
-<div class="line"><a name="l13502"></a><span class="lineno">13502</span>  </div>
-<div class="line"><a name="l13503"></a><span class="lineno">13503</span>  VMA_ASSERT(dstBlockInfoIndex < srcBlockInfoIndex);</div>
-<div class="line"><a name="l13504"></a><span class="lineno">13504</span>  VMA_ASSERT(dstAllocOffset + srcAllocSize <= dstBlockSize);</div>
-<div class="line"><a name="l13505"></a><span class="lineno">13505</span>  </div>
-<div class="line"><a name="l13506"></a><span class="lineno">13506</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l13507"></a><span class="lineno">13507</span>  suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l13508"></a><span class="lineno">13508</span>  suballoc.hAllocation->ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div>
-<div class="line"><a name="l13509"></a><span class="lineno">13509</span>  dstOffset = dstAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l13510"></a><span class="lineno">13510</span>  m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l13511"></a><span class="lineno">13511</span>  ++m_AllocationsMoved;</div>
-<div class="line"><a name="l13512"></a><span class="lineno">13512</span>  </div>
-<div class="line"><a name="l13513"></a><span class="lineno">13513</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l13514"></a><span class="lineno">13514</span>  ++nextSuballocIt;</div>
-<div class="line"><a name="l13515"></a><span class="lineno">13515</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l13516"></a><span class="lineno">13516</span>  srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l13517"></a><span class="lineno">13517</span>  </div>
-<div class="line"><a name="l13518"></a><span class="lineno">13518</span>  pDstMetadata->m_Suballocations.push_back(suballoc);</div>
-<div class="line"><a name="l13519"></a><span class="lineno">13519</span>  </div>
-<div class="line"><a name="l13520"></a><span class="lineno">13520</span>  VmaDefragmentationMove move = {</div>
-<div class="line"><a name="l13521"></a><span class="lineno">13521</span>  srcOrigBlockIndex, dstOrigBlockIndex,</div>
-<div class="line"><a name="l13522"></a><span class="lineno">13522</span>  srcAllocOffset, dstAllocOffset,</div>
-<div class="line"><a name="l13523"></a><span class="lineno">13523</span>  srcAllocSize };</div>
-<div class="line"><a name="l13524"></a><span class="lineno">13524</span>  moves.push_back(move);</div>
-<div class="line"><a name="l13525"></a><span class="lineno">13525</span>  }</div>
-<div class="line"><a name="l13526"></a><span class="lineno">13526</span>  }</div>
-<div class="line"><a name="l13527"></a><span class="lineno">13527</span>  }</div>
-<div class="line"><a name="l13528"></a><span class="lineno">13528</span>  }</div>
-<div class="line"><a name="l13529"></a><span class="lineno">13529</span>  </div>
-<div class="line"><a name="l13530"></a><span class="lineno">13530</span>  m_BlockInfos.clear();</div>
-<div class="line"><a name="l13531"></a><span class="lineno">13531</span>  </div>
-<div class="line"><a name="l13532"></a><span class="lineno">13532</span>  PostprocessMetadata();</div>
-<div class="line"><a name="l13533"></a><span class="lineno">13533</span>  </div>
-<div class="line"><a name="l13534"></a><span class="lineno">13534</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13535"></a><span class="lineno">13535</span> }</div>
-<div class="line"><a name="l13536"></a><span class="lineno">13536</span>  </div>
-<div class="line"><a name="l13537"></a><span class="lineno">13537</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</div>
-<div class="line"><a name="l13538"></a><span class="lineno">13538</span> {</div>
-<div class="line"><a name="l13539"></a><span class="lineno">13539</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
-<div class="line"><a name="l13540"></a><span class="lineno">13540</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13541"></a><span class="lineno">13541</span>  {</div>
-<div class="line"><a name="l13542"></a><span class="lineno">13542</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
-<div class="line"><a name="l13543"></a><span class="lineno">13543</span>  (VmaBlockMetadata_Generic*)m_pBlockVector->GetBlock(blockIndex)->m_pMetadata;</div>
-<div class="line"><a name="l13544"></a><span class="lineno">13544</span>  pMetadata->m_FreeCount = 0;</div>
-<div class="line"><a name="l13545"></a><span class="lineno">13545</span>  pMetadata->m_SumFreeSize = pMetadata->GetSize();</div>
-<div class="line"><a name="l13546"></a><span class="lineno">13546</span>  pMetadata->m_FreeSuballocationsBySize.clear();</div>
-<div class="line"><a name="l13547"></a><span class="lineno">13547</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata->m_Suballocations.begin();</div>
-<div class="line"><a name="l13548"></a><span class="lineno">13548</span>  it != pMetadata->m_Suballocations.end(); )</div>
-<div class="line"><a name="l13549"></a><span class="lineno">13549</span>  {</div>
-<div class="line"><a name="l13550"></a><span class="lineno">13550</span>  <span class="keywordflow">if</span>(it->type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l13551"></a><span class="lineno">13551</span>  {</div>
-<div class="line"><a name="l13552"></a><span class="lineno">13552</span>  VmaSuballocationList::iterator nextIt = it;</div>
-<div class="line"><a name="l13553"></a><span class="lineno">13553</span>  ++nextIt;</div>
-<div class="line"><a name="l13554"></a><span class="lineno">13554</span>  pMetadata->m_Suballocations.erase(it);</div>
-<div class="line"><a name="l13555"></a><span class="lineno">13555</span>  it = nextIt;</div>
-<div class="line"><a name="l13556"></a><span class="lineno">13556</span>  }</div>
-<div class="line"><a name="l13557"></a><span class="lineno">13557</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13558"></a><span class="lineno">13558</span>  {</div>
-<div class="line"><a name="l13559"></a><span class="lineno">13559</span>  ++it;</div>
-<div class="line"><a name="l13560"></a><span class="lineno">13560</span>  }</div>
-<div class="line"><a name="l13561"></a><span class="lineno">13561</span>  }</div>
-<div class="line"><a name="l13562"></a><span class="lineno">13562</span>  }</div>
-<div class="line"><a name="l13563"></a><span class="lineno">13563</span> }</div>
-<div class="line"><a name="l13564"></a><span class="lineno">13564</span>  </div>
-<div class="line"><a name="l13565"></a><span class="lineno">13565</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</div>
-<div class="line"><a name="l13566"></a><span class="lineno">13566</span> {</div>
-<div class="line"><a name="l13567"></a><span class="lineno">13567</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
-<div class="line"><a name="l13568"></a><span class="lineno">13568</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13569"></a><span class="lineno">13569</span>  {</div>
-<div class="line"><a name="l13570"></a><span class="lineno">13570</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
-<div class="line"><a name="l13571"></a><span class="lineno">13571</span>  (VmaBlockMetadata_Generic*)m_pBlockVector->GetBlock(blockIndex)->m_pMetadata;</div>
-<div class="line"><a name="l13572"></a><span class="lineno">13572</span>  <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata->GetSize();</div>
-<div class="line"><a name="l13573"></a><span class="lineno">13573</span>  </div>
-<div class="line"><a name="l13574"></a><span class="lineno">13574</span>  <span class="comment">// No allocations in this block - entire area is free.</span></div>
-<div class="line"><a name="l13575"></a><span class="lineno">13575</span>  <span class="keywordflow">if</span>(pMetadata->m_Suballocations.empty())</div>
-<div class="line"><a name="l13576"></a><span class="lineno">13576</span>  {</div>
-<div class="line"><a name="l13577"></a><span class="lineno">13577</span>  pMetadata->m_FreeCount = 1;</div>
-<div class="line"><a name="l13578"></a><span class="lineno">13578</span>  <span class="comment">//pMetadata->m_SumFreeSize is already set to blockSize.</span></div>
-<div class="line"><a name="l13579"></a><span class="lineno">13579</span>  VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l13580"></a><span class="lineno">13580</span>  0, <span class="comment">// offset</span></div>
-<div class="line"><a name="l13581"></a><span class="lineno">13581</span>  blockSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l13582"></a><span class="lineno">13582</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l13583"></a><span class="lineno">13583</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l13584"></a><span class="lineno">13584</span>  pMetadata->m_Suballocations.push_back(suballoc);</div>
-<div class="line"><a name="l13585"></a><span class="lineno">13585</span>  pMetadata->RegisterFreeSuballocation(pMetadata->m_Suballocations.begin());</div>
-<div class="line"><a name="l13586"></a><span class="lineno">13586</span>  }</div>
-<div class="line"><a name="l13587"></a><span class="lineno">13587</span>  <span class="comment">// There are some allocations in this block.</span></div>
-<div class="line"><a name="l13588"></a><span class="lineno">13588</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13589"></a><span class="lineno">13589</span>  {</div>
-<div class="line"><a name="l13590"></a><span class="lineno">13590</span>  VkDeviceSize offset = 0;</div>
-<div class="line"><a name="l13591"></a><span class="lineno">13591</span>  VmaSuballocationList::iterator it;</div>
-<div class="line"><a name="l13592"></a><span class="lineno">13592</span>  <span class="keywordflow">for</span>(it = pMetadata->m_Suballocations.begin();</div>
-<div class="line"><a name="l13593"></a><span class="lineno">13593</span>  it != pMetadata->m_Suballocations.end();</div>
-<div class="line"><a name="l13594"></a><span class="lineno">13594</span>  ++it)</div>
-<div class="line"><a name="l13595"></a><span class="lineno">13595</span>  {</div>
-<div class="line"><a name="l13596"></a><span class="lineno">13596</span>  VMA_ASSERT(it->type != VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l13597"></a><span class="lineno">13597</span>  VMA_ASSERT(it->offset >= offset);</div>
-<div class="line"><a name="l13598"></a><span class="lineno">13598</span>  </div>
-<div class="line"><a name="l13599"></a><span class="lineno">13599</span>  <span class="comment">// Need to insert preceding free space.</span></div>
-<div class="line"><a name="l13600"></a><span class="lineno">13600</span>  <span class="keywordflow">if</span>(it->offset > offset)</div>
-<div class="line"><a name="l13601"></a><span class="lineno">13601</span>  {</div>
-<div class="line"><a name="l13602"></a><span class="lineno">13602</span>  ++pMetadata->m_FreeCount;</div>
-<div class="line"><a name="l13603"></a><span class="lineno">13603</span>  <span class="keyword">const</span> VkDeviceSize freeSize = it->offset - offset;</div>
-<div class="line"><a name="l13604"></a><span class="lineno">13604</span>  VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l13605"></a><span class="lineno">13605</span>  offset, <span class="comment">// offset</span></div>
-<div class="line"><a name="l13606"></a><span class="lineno">13606</span>  freeSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l13607"></a><span class="lineno">13607</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l13608"></a><span class="lineno">13608</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l13609"></a><span class="lineno">13609</span>  VmaSuballocationList::iterator precedingFreeIt = pMetadata->m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l13610"></a><span class="lineno">13610</span>  <span class="keywordflow">if</span>(freeSize >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l13611"></a><span class="lineno">13611</span>  {</div>
-<div class="line"><a name="l13612"></a><span class="lineno">13612</span>  pMetadata->m_FreeSuballocationsBySize.push_back(precedingFreeIt);</div>
-<div class="line"><a name="l13613"></a><span class="lineno">13613</span>  }</div>
-<div class="line"><a name="l13614"></a><span class="lineno">13614</span>  }</div>
-<div class="line"><a name="l13615"></a><span class="lineno">13615</span>  </div>
-<div class="line"><a name="l13616"></a><span class="lineno">13616</span>  pMetadata->m_SumFreeSize -= it->size;</div>
-<div class="line"><a name="l13617"></a><span class="lineno">13617</span>  offset = it->offset + it->size;</div>
-<div class="line"><a name="l13618"></a><span class="lineno">13618</span>  }</div>
-<div class="line"><a name="l13619"></a><span class="lineno">13619</span>  </div>
-<div class="line"><a name="l13620"></a><span class="lineno">13620</span>  <span class="comment">// Need to insert trailing free space.</span></div>
-<div class="line"><a name="l13621"></a><span class="lineno">13621</span>  <span class="keywordflow">if</span>(offset < blockSize)</div>
-<div class="line"><a name="l13622"></a><span class="lineno">13622</span>  {</div>
-<div class="line"><a name="l13623"></a><span class="lineno">13623</span>  ++pMetadata->m_FreeCount;</div>
-<div class="line"><a name="l13624"></a><span class="lineno">13624</span>  <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div>
-<div class="line"><a name="l13625"></a><span class="lineno">13625</span>  VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l13626"></a><span class="lineno">13626</span>  offset, <span class="comment">// offset</span></div>
-<div class="line"><a name="l13627"></a><span class="lineno">13627</span>  freeSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l13628"></a><span class="lineno">13628</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l13629"></a><span class="lineno">13629</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l13630"></a><span class="lineno">13630</span>  VMA_ASSERT(it == pMetadata->m_Suballocations.end());</div>
-<div class="line"><a name="l13631"></a><span class="lineno">13631</span>  VmaSuballocationList::iterator trailingFreeIt = pMetadata->m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l13632"></a><span class="lineno">13632</span>  <span class="keywordflow">if</span>(freeSize > VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l13633"></a><span class="lineno">13633</span>  {</div>
-<div class="line"><a name="l13634"></a><span class="lineno">13634</span>  pMetadata->m_FreeSuballocationsBySize.push_back(trailingFreeIt);</div>
-<div class="line"><a name="l13635"></a><span class="lineno">13635</span>  }</div>
-<div class="line"><a name="l13636"></a><span class="lineno">13636</span>  }</div>
-<div class="line"><a name="l13637"></a><span class="lineno">13637</span>  </div>
-<div class="line"><a name="l13638"></a><span class="lineno">13638</span>  VMA_SORT(</div>
-<div class="line"><a name="l13639"></a><span class="lineno">13639</span>  pMetadata->m_FreeSuballocationsBySize.begin(),</div>
-<div class="line"><a name="l13640"></a><span class="lineno">13640</span>  pMetadata->m_FreeSuballocationsBySize.end(),</div>
-<div class="line"><a name="l13641"></a><span class="lineno">13641</span>  VmaSuballocationItemSizeLess());</div>
-<div class="line"><a name="l13642"></a><span class="lineno">13642</span>  }</div>
+<div class="line"><a name="l13426"></a><span class="lineno">13426</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13427"></a><span class="lineno">13427</span>  suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13428"></a><span class="lineno">13428</span>  suballoc.hAllocation->ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div>
+<div class="line"><a name="l13429"></a><span class="lineno">13429</span>  m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13430"></a><span class="lineno">13430</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13431"></a><span class="lineno">13431</span>  </div>
+<div class="line"><a name="l13432"></a><span class="lineno">13432</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13433"></a><span class="lineno">13433</span>  ++nextSuballocIt;</div>
+<div class="line"><a name="l13434"></a><span class="lineno">13434</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13435"></a><span class="lineno">13435</span>  srcSuballocIt = nextSuballocIt;</div>
+<div class="line"><a name="l13436"></a><span class="lineno">13436</span>  </div>
+<div class="line"><a name="l13437"></a><span class="lineno">13437</span>  InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
+<div class="line"><a name="l13438"></a><span class="lineno">13438</span>  </div>
+<div class="line"><a name="l13439"></a><span class="lineno">13439</span>  VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13440"></a><span class="lineno">13440</span>  srcOrigBlockIndex, freeSpaceOrigBlockIndex,</div>
+<div class="line"><a name="l13441"></a><span class="lineno">13441</span>  srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13442"></a><span class="lineno">13442</span>  srcAllocSize };</div>
+<div class="line"><a name="l13443"></a><span class="lineno">13443</span>  moves.push_back(move);</div>
+<div class="line"><a name="l13444"></a><span class="lineno">13444</span>  }</div>
+<div class="line"><a name="l13445"></a><span class="lineno">13445</span>  }</div>
+<div class="line"><a name="l13446"></a><span class="lineno">13446</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13447"></a><span class="lineno">13447</span>  {</div>
+<div class="line"><a name="l13448"></a><span class="lineno">13448</span>  dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</div>
+<div class="line"><a name="l13449"></a><span class="lineno">13449</span>  </div>
+<div class="line"><a name="l13450"></a><span class="lineno">13450</span>  <span class="comment">// If the allocation doesn't fit before the end of dstBlock, forward to next block.</span></div>
+<div class="line"><a name="l13451"></a><span class="lineno">13451</span>  <span class="keywordflow">while</span>(dstBlockInfoIndex < srcBlockInfoIndex &&</div>
+<div class="line"><a name="l13452"></a><span class="lineno">13452</span>  dstAllocOffset + srcAllocSize > dstBlockSize)</div>
+<div class="line"><a name="l13453"></a><span class="lineno">13453</span>  {</div>
+<div class="line"><a name="l13454"></a><span class="lineno">13454</span>  <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div>
+<div class="line"><a name="l13455"></a><span class="lineno">13455</span>  freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</div>
+<div class="line"><a name="l13456"></a><span class="lineno">13456</span>  </div>
+<div class="line"><a name="l13457"></a><span class="lineno">13457</span>  ++dstBlockInfoIndex;</div>
+<div class="line"><a name="l13458"></a><span class="lineno">13458</span>  dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l13459"></a><span class="lineno">13459</span>  pDstBlock = m_pBlockVector->GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l13460"></a><span class="lineno">13460</span>  pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock->m_pMetadata;</div>
+<div class="line"><a name="l13461"></a><span class="lineno">13461</span>  dstBlockSize = pDstMetadata->GetSize();</div>
+<div class="line"><a name="l13462"></a><span class="lineno">13462</span>  dstOffset = 0;</div>
+<div class="line"><a name="l13463"></a><span class="lineno">13463</span>  dstAllocOffset = 0;</div>
+<div class="line"><a name="l13464"></a><span class="lineno">13464</span>  }</div>
+<div class="line"><a name="l13465"></a><span class="lineno">13465</span>  </div>
+<div class="line"><a name="l13466"></a><span class="lineno">13466</span>  <span class="comment">// Same block</span></div>
+<div class="line"><a name="l13467"></a><span class="lineno">13467</span>  <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l13468"></a><span class="lineno">13468</span>  {</div>
+<div class="line"><a name="l13469"></a><span class="lineno">13469</span>  VMA_ASSERT(dstAllocOffset <= srcAllocOffset);</div>
+<div class="line"><a name="l13470"></a><span class="lineno">13470</span>  </div>
+<div class="line"><a name="l13471"></a><span class="lineno">13471</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize > srcAllocOffset;</div>
+<div class="line"><a name="l13472"></a><span class="lineno">13472</span>  </div>
+<div class="line"><a name="l13473"></a><span class="lineno">13473</span>  <span class="keywordtype">bool</span> skipOver = overlap;</div>
+<div class="line"><a name="l13474"></a><span class="lineno">13474</span>  <span class="keywordflow">if</span>(overlap && m_OverlappingMoveSupported && dstAllocOffset < srcAllocOffset)</div>
+<div class="line"><a name="l13475"></a><span class="lineno">13475</span>  {</div>
+<div class="line"><a name="l13476"></a><span class="lineno">13476</span>  <span class="comment">// If destination and source place overlap, skip if it would move it</span></div>
+<div class="line"><a name="l13477"></a><span class="lineno">13477</span>  <span class="comment">// by only < 1/64 of its size.</span></div>
+<div class="line"><a name="l13478"></a><span class="lineno">13478</span>  skipOver = (srcAllocOffset - dstAllocOffset) * 64 < srcAllocSize;</div>
+<div class="line"><a name="l13479"></a><span class="lineno">13479</span>  }</div>
+<div class="line"><a name="l13480"></a><span class="lineno">13480</span>  </div>
+<div class="line"><a name="l13481"></a><span class="lineno">13481</span>  <span class="keywordflow">if</span>(skipOver)</div>
+<div class="line"><a name="l13482"></a><span class="lineno">13482</span>  {</div>
+<div class="line"><a name="l13483"></a><span class="lineno">13483</span>  freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</div>
+<div class="line"><a name="l13484"></a><span class="lineno">13484</span>  </div>
+<div class="line"><a name="l13485"></a><span class="lineno">13485</span>  dstOffset = srcAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13486"></a><span class="lineno">13486</span>  ++srcSuballocIt;</div>
+<div class="line"><a name="l13487"></a><span class="lineno">13487</span>  }</div>
+<div class="line"><a name="l13488"></a><span class="lineno">13488</span>  <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
+<div class="line"><a name="l13489"></a><span class="lineno">13489</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13490"></a><span class="lineno">13490</span>  {</div>
+<div class="line"><a name="l13491"></a><span class="lineno">13491</span>  srcSuballocIt->offset = dstAllocOffset;</div>
+<div class="line"><a name="l13492"></a><span class="lineno">13492</span>  srcSuballocIt->hAllocation->ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l13493"></a><span class="lineno">13493</span>  dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13494"></a><span class="lineno">13494</span>  m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13495"></a><span class="lineno">13495</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13496"></a><span class="lineno">13496</span>  ++srcSuballocIt;</div>
+<div class="line"><a name="l13497"></a><span class="lineno">13497</span>  VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13498"></a><span class="lineno">13498</span>  srcOrigBlockIndex, dstOrigBlockIndex,</div>
+<div class="line"><a name="l13499"></a><span class="lineno">13499</span>  srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13500"></a><span class="lineno">13500</span>  srcAllocSize };</div>
+<div class="line"><a name="l13501"></a><span class="lineno">13501</span>  moves.push_back(move);</div>
+<div class="line"><a name="l13502"></a><span class="lineno">13502</span>  }</div>
+<div class="line"><a name="l13503"></a><span class="lineno">13503</span>  }</div>
+<div class="line"><a name="l13504"></a><span class="lineno">13504</span>  <span class="comment">// Different block</span></div>
+<div class="line"><a name="l13505"></a><span class="lineno">13505</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13506"></a><span class="lineno">13506</span>  {</div>
+<div class="line"><a name="l13507"></a><span class="lineno">13507</span>  <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l13508"></a><span class="lineno">13508</span>  </div>
+<div class="line"><a name="l13509"></a><span class="lineno">13509</span>  VMA_ASSERT(dstBlockInfoIndex < srcBlockInfoIndex);</div>
+<div class="line"><a name="l13510"></a><span class="lineno">13510</span>  VMA_ASSERT(dstAllocOffset + srcAllocSize <= dstBlockSize);</div>
+<div class="line"><a name="l13511"></a><span class="lineno">13511</span>  </div>
+<div class="line"><a name="l13512"></a><span class="lineno">13512</span>  VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l13513"></a><span class="lineno">13513</span>  suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l13514"></a><span class="lineno">13514</span>  suballoc.hAllocation->ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div>
+<div class="line"><a name="l13515"></a><span class="lineno">13515</span>  dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l13516"></a><span class="lineno">13516</span>  m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l13517"></a><span class="lineno">13517</span>  ++m_AllocationsMoved;</div>
+<div class="line"><a name="l13518"></a><span class="lineno">13518</span>  </div>
+<div class="line"><a name="l13519"></a><span class="lineno">13519</span>  VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l13520"></a><span class="lineno">13520</span>  ++nextSuballocIt;</div>
+<div class="line"><a name="l13521"></a><span class="lineno">13521</span>  pSrcMetadata->m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l13522"></a><span class="lineno">13522</span>  srcSuballocIt = nextSuballocIt;</div>
+<div class="line"><a name="l13523"></a><span class="lineno">13523</span>  </div>
+<div class="line"><a name="l13524"></a><span class="lineno">13524</span>  pDstMetadata->m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l13525"></a><span class="lineno">13525</span>  </div>
+<div class="line"><a name="l13526"></a><span class="lineno">13526</span>  VmaDefragmentationMove move = {</div>
+<div class="line"><a name="l13527"></a><span class="lineno">13527</span>  srcOrigBlockIndex, dstOrigBlockIndex,</div>
+<div class="line"><a name="l13528"></a><span class="lineno">13528</span>  srcAllocOffset, dstAllocOffset,</div>
+<div class="line"><a name="l13529"></a><span class="lineno">13529</span>  srcAllocSize };</div>
+<div class="line"><a name="l13530"></a><span class="lineno">13530</span>  moves.push_back(move);</div>
+<div class="line"><a name="l13531"></a><span class="lineno">13531</span>  }</div>
+<div class="line"><a name="l13532"></a><span class="lineno">13532</span>  }</div>
+<div class="line"><a name="l13533"></a><span class="lineno">13533</span>  }</div>
+<div class="line"><a name="l13534"></a><span class="lineno">13534</span>  }</div>
+<div class="line"><a name="l13535"></a><span class="lineno">13535</span>  </div>
+<div class="line"><a name="l13536"></a><span class="lineno">13536</span>  m_BlockInfos.clear();</div>
+<div class="line"><a name="l13537"></a><span class="lineno">13537</span>  </div>
+<div class="line"><a name="l13538"></a><span class="lineno">13538</span>  PostprocessMetadata();</div>
+<div class="line"><a name="l13539"></a><span class="lineno">13539</span>  </div>
+<div class="line"><a name="l13540"></a><span class="lineno">13540</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13541"></a><span class="lineno">13541</span> }</div>
+<div class="line"><a name="l13542"></a><span class="lineno">13542</span>  </div>
+<div class="line"><a name="l13543"></a><span class="lineno">13543</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</div>
+<div class="line"><a name="l13544"></a><span class="lineno">13544</span> {</div>
+<div class="line"><a name="l13545"></a><span class="lineno">13545</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
+<div class="line"><a name="l13546"></a><span class="lineno">13546</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13547"></a><span class="lineno">13547</span>  {</div>
+<div class="line"><a name="l13548"></a><span class="lineno">13548</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l13549"></a><span class="lineno">13549</span>  (VmaBlockMetadata_Generic*)m_pBlockVector->GetBlock(blockIndex)->m_pMetadata;</div>
+<div class="line"><a name="l13550"></a><span class="lineno">13550</span>  pMetadata->m_FreeCount = 0;</div>
+<div class="line"><a name="l13551"></a><span class="lineno">13551</span>  pMetadata->m_SumFreeSize = pMetadata->GetSize();</div>
+<div class="line"><a name="l13552"></a><span class="lineno">13552</span>  pMetadata->m_FreeSuballocationsBySize.clear();</div>
+<div class="line"><a name="l13553"></a><span class="lineno">13553</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata->m_Suballocations.begin();</div>
+<div class="line"><a name="l13554"></a><span class="lineno">13554</span>  it != pMetadata->m_Suballocations.end(); )</div>
+<div class="line"><a name="l13555"></a><span class="lineno">13555</span>  {</div>
+<div class="line"><a name="l13556"></a><span class="lineno">13556</span>  <span class="keywordflow">if</span>(it->type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l13557"></a><span class="lineno">13557</span>  {</div>
+<div class="line"><a name="l13558"></a><span class="lineno">13558</span>  VmaSuballocationList::iterator nextIt = it;</div>
+<div class="line"><a name="l13559"></a><span class="lineno">13559</span>  ++nextIt;</div>
+<div class="line"><a name="l13560"></a><span class="lineno">13560</span>  pMetadata->m_Suballocations.erase(it);</div>
+<div class="line"><a name="l13561"></a><span class="lineno">13561</span>  it = nextIt;</div>
+<div class="line"><a name="l13562"></a><span class="lineno">13562</span>  }</div>
+<div class="line"><a name="l13563"></a><span class="lineno">13563</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13564"></a><span class="lineno">13564</span>  {</div>
+<div class="line"><a name="l13565"></a><span class="lineno">13565</span>  ++it;</div>
+<div class="line"><a name="l13566"></a><span class="lineno">13566</span>  }</div>
+<div class="line"><a name="l13567"></a><span class="lineno">13567</span>  }</div>
+<div class="line"><a name="l13568"></a><span class="lineno">13568</span>  }</div>
+<div class="line"><a name="l13569"></a><span class="lineno">13569</span> }</div>
+<div class="line"><a name="l13570"></a><span class="lineno">13570</span>  </div>
+<div class="line"><a name="l13571"></a><span class="lineno">13571</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</div>
+<div class="line"><a name="l13572"></a><span class="lineno">13572</span> {</div>
+<div class="line"><a name="l13573"></a><span class="lineno">13573</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector->GetBlockCount();</div>
+<div class="line"><a name="l13574"></a><span class="lineno">13574</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex < blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13575"></a><span class="lineno">13575</span>  {</div>
+<div class="line"><a name="l13576"></a><span class="lineno">13576</span>  VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l13577"></a><span class="lineno">13577</span>  (VmaBlockMetadata_Generic*)m_pBlockVector->GetBlock(blockIndex)->m_pMetadata;</div>
+<div class="line"><a name="l13578"></a><span class="lineno">13578</span>  <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata->GetSize();</div>
+<div class="line"><a name="l13579"></a><span class="lineno">13579</span>  </div>
+<div class="line"><a name="l13580"></a><span class="lineno">13580</span>  <span class="comment">// No allocations in this block - entire area is free.</span></div>
+<div class="line"><a name="l13581"></a><span class="lineno">13581</span>  <span class="keywordflow">if</span>(pMetadata->m_Suballocations.empty())</div>
+<div class="line"><a name="l13582"></a><span class="lineno">13582</span>  {</div>
+<div class="line"><a name="l13583"></a><span class="lineno">13583</span>  pMetadata->m_FreeCount = 1;</div>
+<div class="line"><a name="l13584"></a><span class="lineno">13584</span>  <span class="comment">//pMetadata->m_SumFreeSize is already set to blockSize.</span></div>
+<div class="line"><a name="l13585"></a><span class="lineno">13585</span>  VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13586"></a><span class="lineno">13586</span>  0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13587"></a><span class="lineno">13587</span>  blockSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13588"></a><span class="lineno">13588</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13589"></a><span class="lineno">13589</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13590"></a><span class="lineno">13590</span>  pMetadata->m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l13591"></a><span class="lineno">13591</span>  pMetadata->RegisterFreeSuballocation(pMetadata->m_Suballocations.begin());</div>
+<div class="line"><a name="l13592"></a><span class="lineno">13592</span>  }</div>
+<div class="line"><a name="l13593"></a><span class="lineno">13593</span>  <span class="comment">// There are some allocations in this block.</span></div>
+<div class="line"><a name="l13594"></a><span class="lineno">13594</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13595"></a><span class="lineno">13595</span>  {</div>
+<div class="line"><a name="l13596"></a><span class="lineno">13596</span>  VkDeviceSize offset = 0;</div>
+<div class="line"><a name="l13597"></a><span class="lineno">13597</span>  VmaSuballocationList::iterator it;</div>
+<div class="line"><a name="l13598"></a><span class="lineno">13598</span>  <span class="keywordflow">for</span>(it = pMetadata->m_Suballocations.begin();</div>
+<div class="line"><a name="l13599"></a><span class="lineno">13599</span>  it != pMetadata->m_Suballocations.end();</div>
+<div class="line"><a name="l13600"></a><span class="lineno">13600</span>  ++it)</div>
+<div class="line"><a name="l13601"></a><span class="lineno">13601</span>  {</div>
+<div class="line"><a name="l13602"></a><span class="lineno">13602</span>  VMA_ASSERT(it->type != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l13603"></a><span class="lineno">13603</span>  VMA_ASSERT(it->offset >= offset);</div>
+<div class="line"><a name="l13604"></a><span class="lineno">13604</span>  </div>
+<div class="line"><a name="l13605"></a><span class="lineno">13605</span>  <span class="comment">// Need to insert preceding free space.</span></div>
+<div class="line"><a name="l13606"></a><span class="lineno">13606</span>  <span class="keywordflow">if</span>(it->offset > offset)</div>
+<div class="line"><a name="l13607"></a><span class="lineno">13607</span>  {</div>
+<div class="line"><a name="l13608"></a><span class="lineno">13608</span>  ++pMetadata->m_FreeCount;</div>
+<div class="line"><a name="l13609"></a><span class="lineno">13609</span>  <span class="keyword">const</span> VkDeviceSize freeSize = it->offset - offset;</div>
+<div class="line"><a name="l13610"></a><span class="lineno">13610</span>  VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13611"></a><span class="lineno">13611</span>  offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13612"></a><span class="lineno">13612</span>  freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13613"></a><span class="lineno">13613</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13614"></a><span class="lineno">13614</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13615"></a><span class="lineno">13615</span>  VmaSuballocationList::iterator precedingFreeIt = pMetadata->m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13616"></a><span class="lineno">13616</span>  <span class="keywordflow">if</span>(freeSize >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l13617"></a><span class="lineno">13617</span>  {</div>
+<div class="line"><a name="l13618"></a><span class="lineno">13618</span>  pMetadata->m_FreeSuballocationsBySize.push_back(precedingFreeIt);</div>
+<div class="line"><a name="l13619"></a><span class="lineno">13619</span>  }</div>
+<div class="line"><a name="l13620"></a><span class="lineno">13620</span>  }</div>
+<div class="line"><a name="l13621"></a><span class="lineno">13621</span>  </div>
+<div class="line"><a name="l13622"></a><span class="lineno">13622</span>  pMetadata->m_SumFreeSize -= it->size;</div>
+<div class="line"><a name="l13623"></a><span class="lineno">13623</span>  offset = it->offset + it->size;</div>
+<div class="line"><a name="l13624"></a><span class="lineno">13624</span>  }</div>
+<div class="line"><a name="l13625"></a><span class="lineno">13625</span>  </div>
+<div class="line"><a name="l13626"></a><span class="lineno">13626</span>  <span class="comment">// Need to insert trailing free space.</span></div>
+<div class="line"><a name="l13627"></a><span class="lineno">13627</span>  <span class="keywordflow">if</span>(offset < blockSize)</div>
+<div class="line"><a name="l13628"></a><span class="lineno">13628</span>  {</div>
+<div class="line"><a name="l13629"></a><span class="lineno">13629</span>  ++pMetadata->m_FreeCount;</div>
+<div class="line"><a name="l13630"></a><span class="lineno">13630</span>  <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div>
+<div class="line"><a name="l13631"></a><span class="lineno">13631</span>  VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l13632"></a><span class="lineno">13632</span>  offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l13633"></a><span class="lineno">13633</span>  freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l13634"></a><span class="lineno">13634</span>  VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l13635"></a><span class="lineno">13635</span>  VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l13636"></a><span class="lineno">13636</span>  VMA_ASSERT(it == pMetadata->m_Suballocations.end());</div>
+<div class="line"><a name="l13637"></a><span class="lineno">13637</span>  VmaSuballocationList::iterator trailingFreeIt = pMetadata->m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13638"></a><span class="lineno">13638</span>  <span class="keywordflow">if</span>(freeSize > VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l13639"></a><span class="lineno">13639</span>  {</div>
+<div class="line"><a name="l13640"></a><span class="lineno">13640</span>  pMetadata->m_FreeSuballocationsBySize.push_back(trailingFreeIt);</div>
+<div class="line"><a name="l13641"></a><span class="lineno">13641</span>  }</div>
+<div class="line"><a name="l13642"></a><span class="lineno">13642</span>  }</div>
<div class="line"><a name="l13643"></a><span class="lineno">13643</span>  </div>
-<div class="line"><a name="l13644"></a><span class="lineno">13644</span>  VMA_HEAVY_ASSERT(pMetadata->Validate());</div>
-<div class="line"><a name="l13645"></a><span class="lineno">13645</span>  }</div>
-<div class="line"><a name="l13646"></a><span class="lineno">13646</span> }</div>
-<div class="line"><a name="l13647"></a><span class="lineno">13647</span>  </div>
-<div class="line"><a name="l13648"></a><span class="lineno">13648</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation& suballoc)</div>
-<div class="line"><a name="l13649"></a><span class="lineno">13649</span> {</div>
-<div class="line"><a name="l13650"></a><span class="lineno">13650</span>  <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div>
-<div class="line"><a name="l13651"></a><span class="lineno">13651</span>  VmaSuballocationList::iterator it = pMetadata->m_Suballocations.begin();</div>
-<div class="line"><a name="l13652"></a><span class="lineno">13652</span>  <span class="keywordflow">while</span>(it != pMetadata->m_Suballocations.end())</div>
-<div class="line"><a name="l13653"></a><span class="lineno">13653</span>  {</div>
-<div class="line"><a name="l13654"></a><span class="lineno">13654</span>  <span class="keywordflow">if</span>(it->offset < suballoc.offset)</div>
-<div class="line"><a name="l13655"></a><span class="lineno">13655</span>  {</div>
-<div class="line"><a name="l13656"></a><span class="lineno">13656</span>  ++it;</div>
-<div class="line"><a name="l13657"></a><span class="lineno">13657</span>  }</div>
-<div class="line"><a name="l13658"></a><span class="lineno">13658</span>  }</div>
-<div class="line"><a name="l13659"></a><span class="lineno">13659</span>  pMetadata->m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l13660"></a><span class="lineno">13660</span> }</div>
-<div class="line"><a name="l13661"></a><span class="lineno">13661</span>  </div>
-<div class="line"><a name="l13663"></a><span class="lineno">13663</span> <span class="comment">// VmaBlockVectorDefragmentationContext</span></div>
-<div class="line"><a name="l13664"></a><span class="lineno">13664</span>  </div>
-<div class="line"><a name="l13665"></a><span class="lineno">13665</span> VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div>
-<div class="line"><a name="l13666"></a><span class="lineno">13666</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l13667"></a><span class="lineno">13667</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div>
-<div class="line"><a name="l13668"></a><span class="lineno">13668</span>  VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l13669"></a><span class="lineno">13669</span>  uint32_t currFrameIndex) :</div>
-<div class="line"><a name="l13670"></a><span class="lineno">13670</span>  res(VK_SUCCESS),</div>
-<div class="line"><a name="l13671"></a><span class="lineno">13671</span>  mutexLocked(false),</div>
-<div class="line"><a name="l13672"></a><span class="lineno">13672</span>  blockContexts(VmaStlAllocator<VmaBlockDefragmentationContext>(hAllocator->GetAllocationCallbacks())),</div>
-<div class="line"><a name="l13673"></a><span class="lineno">13673</span>  m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l13674"></a><span class="lineno">13674</span>  m_hCustomPool(hCustomPool),</div>
-<div class="line"><a name="l13675"></a><span class="lineno">13675</span>  m_pBlockVector(pBlockVector),</div>
-<div class="line"><a name="l13676"></a><span class="lineno">13676</span>  m_CurrFrameIndex(currFrameIndex),</div>
-<div class="line"><a name="l13677"></a><span class="lineno">13677</span>  m_pAlgorithm(VMA_NULL),</div>
-<div class="line"><a name="l13678"></a><span class="lineno">13678</span>  m_Allocations(VmaStlAllocator<AllocInfo>(hAllocator->GetAllocationCallbacks())),</div>
-<div class="line"><a name="l13679"></a><span class="lineno">13679</span>  m_AllAllocations(false)</div>
-<div class="line"><a name="l13680"></a><span class="lineno">13680</span> {</div>
-<div class="line"><a name="l13681"></a><span class="lineno">13681</span> }</div>
-<div class="line"><a name="l13682"></a><span class="lineno">13682</span>  </div>
-<div class="line"><a name="l13683"></a><span class="lineno">13683</span> VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</div>
-<div class="line"><a name="l13684"></a><span class="lineno">13684</span> {</div>
-<div class="line"><a name="l13685"></a><span class="lineno">13685</span>  vma_delete(m_hAllocator, m_pAlgorithm);</div>
-<div class="line"><a name="l13686"></a><span class="lineno">13686</span> }</div>
-<div class="line"><a name="l13687"></a><span class="lineno">13687</span>  </div>
-<div class="line"><a name="l13688"></a><span class="lineno">13688</span> <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="l13689"></a><span class="lineno">13689</span> {</div>
-<div class="line"><a name="l13690"></a><span class="lineno">13690</span>  AllocInfo info = { hAlloc, pChanged };</div>
-<div class="line"><a name="l13691"></a><span class="lineno">13691</span>  m_Allocations.push_back(info);</div>
+<div class="line"><a name="l13644"></a><span class="lineno">13644</span>  VMA_SORT(</div>
+<div class="line"><a name="l13645"></a><span class="lineno">13645</span>  pMetadata->m_FreeSuballocationsBySize.begin(),</div>
+<div class="line"><a name="l13646"></a><span class="lineno">13646</span>  pMetadata->m_FreeSuballocationsBySize.end(),</div>
+<div class="line"><a name="l13647"></a><span class="lineno">13647</span>  VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l13648"></a><span class="lineno">13648</span>  }</div>
+<div class="line"><a name="l13649"></a><span class="lineno">13649</span>  </div>
+<div class="line"><a name="l13650"></a><span class="lineno">13650</span>  VMA_HEAVY_ASSERT(pMetadata->Validate());</div>
+<div class="line"><a name="l13651"></a><span class="lineno">13651</span>  }</div>
+<div class="line"><a name="l13652"></a><span class="lineno">13652</span> }</div>
+<div class="line"><a name="l13653"></a><span class="lineno">13653</span>  </div>
+<div class="line"><a name="l13654"></a><span class="lineno">13654</span> <span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation& suballoc)</div>
+<div class="line"><a name="l13655"></a><span class="lineno">13655</span> {</div>
+<div class="line"><a name="l13656"></a><span class="lineno">13656</span>  <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div>
+<div class="line"><a name="l13657"></a><span class="lineno">13657</span>  VmaSuballocationList::iterator it = pMetadata->m_Suballocations.begin();</div>
+<div class="line"><a name="l13658"></a><span class="lineno">13658</span>  <span class="keywordflow">while</span>(it != pMetadata->m_Suballocations.end())</div>
+<div class="line"><a name="l13659"></a><span class="lineno">13659</span>  {</div>
+<div class="line"><a name="l13660"></a><span class="lineno">13660</span>  <span class="keywordflow">if</span>(it->offset < suballoc.offset)</div>
+<div class="line"><a name="l13661"></a><span class="lineno">13661</span>  {</div>
+<div class="line"><a name="l13662"></a><span class="lineno">13662</span>  ++it;</div>
+<div class="line"><a name="l13663"></a><span class="lineno">13663</span>  }</div>
+<div class="line"><a name="l13664"></a><span class="lineno">13664</span>  }</div>
+<div class="line"><a name="l13665"></a><span class="lineno">13665</span>  pMetadata->m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l13666"></a><span class="lineno">13666</span> }</div>
+<div class="line"><a name="l13667"></a><span class="lineno">13667</span>  </div>
+<div class="line"><a name="l13669"></a><span class="lineno">13669</span> <span class="comment">// VmaBlockVectorDefragmentationContext</span></div>
+<div class="line"><a name="l13670"></a><span class="lineno">13670</span>  </div>
+<div class="line"><a name="l13671"></a><span class="lineno">13671</span> VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div>
+<div class="line"><a name="l13672"></a><span class="lineno">13672</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13673"></a><span class="lineno">13673</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div>
+<div class="line"><a name="l13674"></a><span class="lineno">13674</span>  VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l13675"></a><span class="lineno">13675</span>  uint32_t currFrameIndex) :</div>
+<div class="line"><a name="l13676"></a><span class="lineno">13676</span>  res(VK_SUCCESS),</div>
+<div class="line"><a name="l13677"></a><span class="lineno">13677</span>  mutexLocked(false),</div>
+<div class="line"><a name="l13678"></a><span class="lineno">13678</span>  blockContexts(VmaStlAllocator<VmaBlockDefragmentationContext>(hAllocator->GetAllocationCallbacks())),</div>
+<div class="line"><a name="l13679"></a><span class="lineno">13679</span>  m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l13680"></a><span class="lineno">13680</span>  m_hCustomPool(hCustomPool),</div>
+<div class="line"><a name="l13681"></a><span class="lineno">13681</span>  m_pBlockVector(pBlockVector),</div>
+<div class="line"><a name="l13682"></a><span class="lineno">13682</span>  m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l13683"></a><span class="lineno">13683</span>  m_pAlgorithm(VMA_NULL),</div>
+<div class="line"><a name="l13684"></a><span class="lineno">13684</span>  m_Allocations(VmaStlAllocator<AllocInfo>(hAllocator->GetAllocationCallbacks())),</div>
+<div class="line"><a name="l13685"></a><span class="lineno">13685</span>  m_AllAllocations(false)</div>
+<div class="line"><a name="l13686"></a><span class="lineno">13686</span> {</div>
+<div class="line"><a name="l13687"></a><span class="lineno">13687</span> }</div>
+<div class="line"><a name="l13688"></a><span class="lineno">13688</span>  </div>
+<div class="line"><a name="l13689"></a><span class="lineno">13689</span> VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</div>
+<div class="line"><a name="l13690"></a><span class="lineno">13690</span> {</div>
+<div class="line"><a name="l13691"></a><span class="lineno">13691</span>  vma_delete(m_hAllocator, m_pAlgorithm);</div>
<div class="line"><a name="l13692"></a><span class="lineno">13692</span> }</div>
<div class="line"><a name="l13693"></a><span class="lineno">13693</span>  </div>
-<div class="line"><a name="l13694"></a><span class="lineno">13694</span> <span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported)</div>
+<div class="line"><a name="l13694"></a><span class="lineno">13694</span> <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="l13695"></a><span class="lineno">13695</span> {</div>
-<div class="line"><a name="l13696"></a><span class="lineno">13696</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div>
-<div class="line"><a name="l13697"></a><span class="lineno">13697</span>  m_Allocations.size() == m_pBlockVector->CalcAllocationCount();</div>
-<div class="line"><a name="l13698"></a><span class="lineno">13698</span>  </div>
-<div class="line"><a name="l13699"></a><span class="lineno">13699</span> <span class="comment"> /********************************</span></div>
-<div class="line"><a name="l13700"></a><span class="lineno">13700</span> <span class="comment"> HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div>
-<div class="line"><a name="l13701"></a><span class="lineno">13701</span> <span class="comment"> ********************************/</span></div>
-<div class="line"><a name="l13702"></a><span class="lineno">13702</span>  </div>
-<div class="line"><a name="l13703"></a><span class="lineno">13703</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l13704"></a><span class="lineno">13704</span> <span class="comment"> Fast algorithm is supported only when certain criteria are met:</span></div>
-<div class="line"><a name="l13705"></a><span class="lineno">13705</span> <span class="comment"> - VMA_DEBUG_MARGIN is 0.</span></div>
-<div class="line"><a name="l13706"></a><span class="lineno">13706</span> <span class="comment"> - All allocations in this block vector are moveable.</span></div>
-<div class="line"><a name="l13707"></a><span class="lineno">13707</span> <span class="comment"> - There is no possibility of image/buffer granularity conflict.</span></div>
-<div class="line"><a name="l13708"></a><span class="lineno">13708</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l13709"></a><span class="lineno">13709</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &&</div>
-<div class="line"><a name="l13710"></a><span class="lineno">13710</span>  allAllocations &&</div>
-<div class="line"><a name="l13711"></a><span class="lineno">13711</span>  !m_pBlockVector->IsBufferImageGranularityConflictPossible())</div>
-<div class="line"><a name="l13712"></a><span class="lineno">13712</span>  {</div>
-<div class="line"><a name="l13713"></a><span class="lineno">13713</span>  m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div>
-<div class="line"><a name="l13714"></a><span class="lineno">13714</span>  m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
-<div class="line"><a name="l13715"></a><span class="lineno">13715</span>  }</div>
-<div class="line"><a name="l13716"></a><span class="lineno">13716</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13717"></a><span class="lineno">13717</span>  {</div>
-<div class="line"><a name="l13718"></a><span class="lineno">13718</span>  m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div>
-<div class="line"><a name="l13719"></a><span class="lineno">13719</span>  m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
-<div class="line"><a name="l13720"></a><span class="lineno">13720</span>  }</div>
-<div class="line"><a name="l13721"></a><span class="lineno">13721</span>  </div>
-<div class="line"><a name="l13722"></a><span class="lineno">13722</span>  <span class="keywordflow">if</span>(allAllocations)</div>
+<div class="line"><a name="l13696"></a><span class="lineno">13696</span>  AllocInfo info = { hAlloc, pChanged };</div>
+<div class="line"><a name="l13697"></a><span class="lineno">13697</span>  m_Allocations.push_back(info);</div>
+<div class="line"><a name="l13698"></a><span class="lineno">13698</span> }</div>
+<div class="line"><a name="l13699"></a><span class="lineno">13699</span>  </div>
+<div class="line"><a name="l13700"></a><span class="lineno">13700</span> <span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported)</div>
+<div class="line"><a name="l13701"></a><span class="lineno">13701</span> {</div>
+<div class="line"><a name="l13702"></a><span class="lineno">13702</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div>
+<div class="line"><a name="l13703"></a><span class="lineno">13703</span>  m_Allocations.size() == m_pBlockVector->CalcAllocationCount();</div>
+<div class="line"><a name="l13704"></a><span class="lineno">13704</span>  </div>
+<div class="line"><a name="l13705"></a><span class="lineno">13705</span> <span class="comment"> /********************************</span></div>
+<div class="line"><a name="l13706"></a><span class="lineno">13706</span> <span class="comment"> HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div>
+<div class="line"><a name="l13707"></a><span class="lineno">13707</span> <span class="comment"> ********************************/</span></div>
+<div class="line"><a name="l13708"></a><span class="lineno">13708</span>  </div>
+<div class="line"><a name="l13709"></a><span class="lineno">13709</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l13710"></a><span class="lineno">13710</span> <span class="comment"> Fast algorithm is supported only when certain criteria are met:</span></div>
+<div class="line"><a name="l13711"></a><span class="lineno">13711</span> <span class="comment"> - VMA_DEBUG_MARGIN is 0.</span></div>
+<div class="line"><a name="l13712"></a><span class="lineno">13712</span> <span class="comment"> - All allocations in this block vector are moveable.</span></div>
+<div class="line"><a name="l13713"></a><span class="lineno">13713</span> <span class="comment"> - There is no possibility of image/buffer granularity conflict.</span></div>
+<div class="line"><a name="l13714"></a><span class="lineno">13714</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l13715"></a><span class="lineno">13715</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &&</div>
+<div class="line"><a name="l13716"></a><span class="lineno">13716</span>  allAllocations &&</div>
+<div class="line"><a name="l13717"></a><span class="lineno">13717</span>  !m_pBlockVector->IsBufferImageGranularityConflictPossible())</div>
+<div class="line"><a name="l13718"></a><span class="lineno">13718</span>  {</div>
+<div class="line"><a name="l13719"></a><span class="lineno">13719</span>  m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div>
+<div class="line"><a name="l13720"></a><span class="lineno">13720</span>  m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l13721"></a><span class="lineno">13721</span>  }</div>
+<div class="line"><a name="l13722"></a><span class="lineno">13722</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l13723"></a><span class="lineno">13723</span>  {</div>
-<div class="line"><a name="l13724"></a><span class="lineno">13724</span>  m_pAlgorithm->AddAll();</div>
-<div class="line"><a name="l13725"></a><span class="lineno">13725</span>  }</div>
-<div class="line"><a name="l13726"></a><span class="lineno">13726</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13727"></a><span class="lineno">13727</span>  {</div>
-<div class="line"><a name="l13728"></a><span class="lineno">13728</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i < count; ++i)</div>
-<div class="line"><a name="l13729"></a><span class="lineno">13729</span>  {</div>
-<div class="line"><a name="l13730"></a><span class="lineno">13730</span>  m_pAlgorithm->AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div>
-<div class="line"><a name="l13731"></a><span class="lineno">13731</span>  }</div>
-<div class="line"><a name="l13732"></a><span class="lineno">13732</span>  }</div>
-<div class="line"><a name="l13733"></a><span class="lineno">13733</span> }</div>
-<div class="line"><a name="l13734"></a><span class="lineno">13734</span>  </div>
-<div class="line"><a name="l13736"></a><span class="lineno">13736</span> <span class="comment">// VmaDefragmentationContext</span></div>
-<div class="line"><a name="l13737"></a><span class="lineno">13737</span>  </div>
-<div class="line"><a name="l13738"></a><span class="lineno">13738</span> VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div>
-<div class="line"><a name="l13739"></a><span class="lineno">13739</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l13740"></a><span class="lineno">13740</span>  uint32_t currFrameIndex,</div>
-<div class="line"><a name="l13741"></a><span class="lineno">13741</span>  uint32_t flags,</div>
-<div class="line"><a name="l13742"></a><span class="lineno">13742</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div>
-<div class="line"><a name="l13743"></a><span class="lineno">13743</span>  m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l13744"></a><span class="lineno">13744</span>  m_CurrFrameIndex(currFrameIndex),</div>
-<div class="line"><a name="l13745"></a><span class="lineno">13745</span>  m_Flags(flags),</div>
-<div class="line"><a name="l13746"></a><span class="lineno">13746</span>  m_pStats(pStats),</div>
-<div class="line"><a name="l13747"></a><span class="lineno">13747</span>  m_CustomPoolContexts(VmaStlAllocator<VmaBlockVectorDefragmentationContext*>(hAllocator->GetAllocationCallbacks()))</div>
-<div class="line"><a name="l13748"></a><span class="lineno">13748</span> {</div>
-<div class="line"><a name="l13749"></a><span class="lineno">13749</span>  memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</div>
-<div class="line"><a name="l13750"></a><span class="lineno">13750</span> }</div>
-<div class="line"><a name="l13751"></a><span class="lineno">13751</span>  </div>
-<div class="line"><a name="l13752"></a><span class="lineno">13752</span> VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div>
-<div class="line"><a name="l13753"></a><span class="lineno">13753</span> {</div>
-<div class="line"><a name="l13754"></a><span class="lineno">13754</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l13755"></a><span class="lineno">13755</span>  {</div>
-<div class="line"><a name="l13756"></a><span class="lineno">13756</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l13757"></a><span class="lineno">13757</span>  pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
-<div class="line"><a name="l13758"></a><span class="lineno">13758</span>  vma_delete(m_hAllocator, pBlockVectorCtx);</div>
-<div class="line"><a name="l13759"></a><span class="lineno">13759</span>  }</div>
-<div class="line"><a name="l13760"></a><span class="lineno">13760</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator->m_MemProps.memoryTypeCount; i--; )</div>
+<div class="line"><a name="l13724"></a><span class="lineno">13724</span>  m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div>
+<div class="line"><a name="l13725"></a><span class="lineno">13725</span>  m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l13726"></a><span class="lineno">13726</span>  }</div>
+<div class="line"><a name="l13727"></a><span class="lineno">13727</span>  </div>
+<div class="line"><a name="l13728"></a><span class="lineno">13728</span>  <span class="keywordflow">if</span>(allAllocations)</div>
+<div class="line"><a name="l13729"></a><span class="lineno">13729</span>  {</div>
+<div class="line"><a name="l13730"></a><span class="lineno">13730</span>  m_pAlgorithm->AddAll();</div>
+<div class="line"><a name="l13731"></a><span class="lineno">13731</span>  }</div>
+<div class="line"><a name="l13732"></a><span class="lineno">13732</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13733"></a><span class="lineno">13733</span>  {</div>
+<div class="line"><a name="l13734"></a><span class="lineno">13734</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i < count; ++i)</div>
+<div class="line"><a name="l13735"></a><span class="lineno">13735</span>  {</div>
+<div class="line"><a name="l13736"></a><span class="lineno">13736</span>  m_pAlgorithm->AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div>
+<div class="line"><a name="l13737"></a><span class="lineno">13737</span>  }</div>
+<div class="line"><a name="l13738"></a><span class="lineno">13738</span>  }</div>
+<div class="line"><a name="l13739"></a><span class="lineno">13739</span> }</div>
+<div class="line"><a name="l13740"></a><span class="lineno">13740</span>  </div>
+<div class="line"><a name="l13742"></a><span class="lineno">13742</span> <span class="comment">// VmaDefragmentationContext</span></div>
+<div class="line"><a name="l13743"></a><span class="lineno">13743</span>  </div>
+<div class="line"><a name="l13744"></a><span class="lineno">13744</span> VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div>
+<div class="line"><a name="l13745"></a><span class="lineno">13745</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l13746"></a><span class="lineno">13746</span>  uint32_t currFrameIndex,</div>
+<div class="line"><a name="l13747"></a><span class="lineno">13747</span>  uint32_t flags,</div>
+<div class="line"><a name="l13748"></a><span class="lineno">13748</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div>
+<div class="line"><a name="l13749"></a><span class="lineno">13749</span>  m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l13750"></a><span class="lineno">13750</span>  m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l13751"></a><span class="lineno">13751</span>  m_Flags(flags),</div>
+<div class="line"><a name="l13752"></a><span class="lineno">13752</span>  m_pStats(pStats),</div>
+<div class="line"><a name="l13753"></a><span class="lineno">13753</span>  m_CustomPoolContexts(VmaStlAllocator<VmaBlockVectorDefragmentationContext*>(hAllocator->GetAllocationCallbacks()))</div>
+<div class="line"><a name="l13754"></a><span class="lineno">13754</span> {</div>
+<div class="line"><a name="l13755"></a><span class="lineno">13755</span>  memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</div>
+<div class="line"><a name="l13756"></a><span class="lineno">13756</span> }</div>
+<div class="line"><a name="l13757"></a><span class="lineno">13757</span>  </div>
+<div class="line"><a name="l13758"></a><span class="lineno">13758</span> VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div>
+<div class="line"><a name="l13759"></a><span class="lineno">13759</span> {</div>
+<div class="line"><a name="l13760"></a><span class="lineno">13760</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
<div class="line"><a name="l13761"></a><span class="lineno">13761</span>  {</div>
-<div class="line"><a name="l13762"></a><span class="lineno">13762</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div>
-<div class="line"><a name="l13763"></a><span class="lineno">13763</span>  <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l13764"></a><span class="lineno">13764</span>  {</div>
-<div class="line"><a name="l13765"></a><span class="lineno">13765</span>  pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
-<div class="line"><a name="l13766"></a><span class="lineno">13766</span>  vma_delete(m_hAllocator, pBlockVectorCtx);</div>
-<div class="line"><a name="l13767"></a><span class="lineno">13767</span>  }</div>
-<div class="line"><a name="l13768"></a><span class="lineno">13768</span>  }</div>
-<div class="line"><a name="l13769"></a><span class="lineno">13769</span> }</div>
-<div class="line"><a name="l13770"></a><span class="lineno">13770</span>  </div>
-<div class="line"><a name="l13771"></a><span class="lineno">13771</span> <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="l13772"></a><span class="lineno">13772</span> {</div>
-<div class="line"><a name="l13773"></a><span class="lineno">13773</span>  <span class="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex < poolCount; ++poolIndex)</div>
-<div class="line"><a name="l13774"></a><span class="lineno">13774</span>  {</div>
-<div class="line"><a name="l13775"></a><span class="lineno">13775</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div>
-<div class="line"><a name="l13776"></a><span class="lineno">13776</span>  VMA_ASSERT(pool);</div>
-<div class="line"><a name="l13777"></a><span class="lineno">13777</span>  <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
-<div class="line"><a name="l13778"></a><span class="lineno">13778</span>  <span class="keywordflow">if</span>(pool->m_BlockVector.GetAlgorithm() == 0)</div>
-<div class="line"><a name="l13779"></a><span class="lineno">13779</span>  {</div>
-<div class="line"><a name="l13780"></a><span class="lineno">13780</span>  VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
-<div class="line"><a name="l13781"></a><span class="lineno">13781</span>  </div>
-<div class="line"><a name="l13782"></a><span class="lineno">13782</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l13783"></a><span class="lineno">13783</span>  {</div>
-<div class="line"><a name="l13784"></a><span class="lineno">13784</span>  <span class="keywordflow">if</span>(m_CustomPoolContexts[i]->GetCustomPool() == pool)</div>
-<div class="line"><a name="l13785"></a><span class="lineno">13785</span>  {</div>
-<div class="line"><a name="l13786"></a><span class="lineno">13786</span>  pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l13787"></a><span class="lineno">13787</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13788"></a><span class="lineno">13788</span>  }</div>
-<div class="line"><a name="l13789"></a><span class="lineno">13789</span>  }</div>
-<div class="line"><a name="l13790"></a><span class="lineno">13790</span>  </div>
-<div class="line"><a name="l13791"></a><span class="lineno">13791</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l13792"></a><span class="lineno">13792</span>  {</div>
-<div class="line"><a name="l13793"></a><span class="lineno">13793</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l13794"></a><span class="lineno">13794</span>  m_hAllocator,</div>
-<div class="line"><a name="l13795"></a><span class="lineno">13795</span>  pool,</div>
-<div class="line"><a name="l13796"></a><span class="lineno">13796</span>  &pool->m_BlockVector,</div>
-<div class="line"><a name="l13797"></a><span class="lineno">13797</span>  m_CurrFrameIndex);</div>
-<div class="line"><a name="l13798"></a><span class="lineno">13798</span>  m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
-<div class="line"><a name="l13799"></a><span class="lineno">13799</span>  }</div>
-<div class="line"><a name="l13800"></a><span class="lineno">13800</span>  </div>
-<div class="line"><a name="l13801"></a><span class="lineno">13801</span>  pBlockVectorDefragCtx->AddAll();</div>
-<div class="line"><a name="l13802"></a><span class="lineno">13802</span>  }</div>
-<div class="line"><a name="l13803"></a><span class="lineno">13803</span>  }</div>
-<div class="line"><a name="l13804"></a><span class="lineno">13804</span> }</div>
-<div class="line"><a name="l13805"></a><span class="lineno">13805</span>  </div>
-<div class="line"><a name="l13806"></a><span class="lineno">13806</span> <span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div>
-<div class="line"><a name="l13807"></a><span class="lineno">13807</span>  uint32_t allocationCount,</div>
-<div class="line"><a name="l13808"></a><span class="lineno">13808</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l13809"></a><span class="lineno">13809</span>  VkBool32* pAllocationsChanged)</div>
-<div class="line"><a name="l13810"></a><span class="lineno">13810</span> {</div>
-<div class="line"><a name="l13811"></a><span class="lineno">13811</span>  <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div>
-<div class="line"><a name="l13812"></a><span class="lineno">13812</span>  <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l13813"></a><span class="lineno">13813</span>  {</div>
-<div class="line"><a name="l13814"></a><span class="lineno">13814</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div>
-<div class="line"><a name="l13815"></a><span class="lineno">13815</span>  VMA_ASSERT(hAlloc);</div>
-<div class="line"><a name="l13816"></a><span class="lineno">13816</span>  <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div>
-<div class="line"><a name="l13817"></a><span class="lineno">13817</span>  <span class="keywordflow">if</span>((hAlloc->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &&</div>
-<div class="line"><a name="l13818"></a><span class="lineno">13818</span>  <span class="comment">// Lost allocation cannot be defragmented.</span></div>
-<div class="line"><a name="l13819"></a><span class="lineno">13819</span>  (hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div>
-<div class="line"><a name="l13820"></a><span class="lineno">13820</span>  {</div>
-<div class="line"><a name="l13821"></a><span class="lineno">13821</span>  VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
-<div class="line"><a name="l13822"></a><span class="lineno">13822</span>  </div>
-<div class="line"><a name="l13823"></a><span class="lineno">13823</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc->GetBlock()->GetParentPool();</div>
-<div class="line"><a name="l13824"></a><span class="lineno">13824</span>  <span class="comment">// This allocation belongs to custom pool.</span></div>
-<div class="line"><a name="l13825"></a><span class="lineno">13825</span>  <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l13826"></a><span class="lineno">13826</span>  {</div>
-<div class="line"><a name="l13827"></a><span class="lineno">13827</span>  <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
-<div class="line"><a name="l13828"></a><span class="lineno">13828</span>  <span class="keywordflow">if</span>(hAllocPool->m_BlockVector.GetAlgorithm() == 0)</div>
-<div class="line"><a name="l13829"></a><span class="lineno">13829</span>  {</div>
-<div class="line"><a name="l13830"></a><span class="lineno">13830</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l13831"></a><span class="lineno">13831</span>  {</div>
-<div class="line"><a name="l13832"></a><span class="lineno">13832</span>  <span class="keywordflow">if</span>(m_CustomPoolContexts[i]->GetCustomPool() == hAllocPool)</div>
-<div class="line"><a name="l13833"></a><span class="lineno">13833</span>  {</div>
-<div class="line"><a name="l13834"></a><span class="lineno">13834</span>  pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l13835"></a><span class="lineno">13835</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13836"></a><span class="lineno">13836</span>  }</div>
-<div class="line"><a name="l13837"></a><span class="lineno">13837</span>  }</div>
-<div class="line"><a name="l13838"></a><span class="lineno">13838</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l13839"></a><span class="lineno">13839</span>  {</div>
-<div class="line"><a name="l13840"></a><span class="lineno">13840</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l13841"></a><span class="lineno">13841</span>  m_hAllocator,</div>
-<div class="line"><a name="l13842"></a><span class="lineno">13842</span>  hAllocPool,</div>
-<div class="line"><a name="l13843"></a><span class="lineno">13843</span>  &hAllocPool->m_BlockVector,</div>
-<div class="line"><a name="l13844"></a><span class="lineno">13844</span>  m_CurrFrameIndex);</div>
-<div class="line"><a name="l13845"></a><span class="lineno">13845</span>  m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
-<div class="line"><a name="l13846"></a><span class="lineno">13846</span>  }</div>
-<div class="line"><a name="l13847"></a><span class="lineno">13847</span>  }</div>
-<div class="line"><a name="l13848"></a><span class="lineno">13848</span>  }</div>
-<div class="line"><a name="l13849"></a><span class="lineno">13849</span>  <span class="comment">// This allocation belongs to default pool.</span></div>
-<div class="line"><a name="l13850"></a><span class="lineno">13850</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13851"></a><span class="lineno">13851</span>  {</div>
-<div class="line"><a name="l13852"></a><span class="lineno">13852</span>  <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l13853"></a><span class="lineno">13853</span>  pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l13854"></a><span class="lineno">13854</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l13855"></a><span class="lineno">13855</span>  {</div>
-<div class="line"><a name="l13856"></a><span class="lineno">13856</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l13857"></a><span class="lineno">13857</span>  m_hAllocator,</div>
-<div class="line"><a name="l13858"></a><span class="lineno">13858</span>  VMA_NULL, <span class="comment">// hCustomPool</span></div>
-<div class="line"><a name="l13859"></a><span class="lineno">13859</span>  m_hAllocator->m_pBlockVectors[memTypeIndex],</div>
-<div class="line"><a name="l13860"></a><span class="lineno">13860</span>  m_CurrFrameIndex);</div>
-<div class="line"><a name="l13861"></a><span class="lineno">13861</span>  m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</div>
-<div class="line"><a name="l13862"></a><span class="lineno">13862</span>  }</div>
-<div class="line"><a name="l13863"></a><span class="lineno">13863</span>  }</div>
-<div class="line"><a name="l13864"></a><span class="lineno">13864</span>  </div>
-<div class="line"><a name="l13865"></a><span class="lineno">13865</span>  <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l13866"></a><span class="lineno">13866</span>  {</div>
-<div class="line"><a name="l13867"></a><span class="lineno">13867</span>  VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div>
-<div class="line"><a name="l13868"></a><span class="lineno">13868</span>  &pAllocationsChanged[allocIndex] : VMA_NULL;</div>
-<div class="line"><a name="l13869"></a><span class="lineno">13869</span>  pBlockVectorDefragCtx->AddAllocation(hAlloc, pChanged);</div>
-<div class="line"><a name="l13870"></a><span class="lineno">13870</span>  }</div>
-<div class="line"><a name="l13871"></a><span class="lineno">13871</span>  }</div>
-<div class="line"><a name="l13872"></a><span class="lineno">13872</span>  }</div>
-<div class="line"><a name="l13873"></a><span class="lineno">13873</span> }</div>
-<div class="line"><a name="l13874"></a><span class="lineno">13874</span>  </div>
-<div class="line"><a name="l13875"></a><span class="lineno">13875</span> VkResult VmaDefragmentationContext_T::Defragment(</div>
-<div class="line"><a name="l13876"></a><span class="lineno">13876</span>  VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l13877"></a><span class="lineno">13877</span>  VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l13878"></a><span class="lineno">13878</span>  VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
-<div class="line"><a name="l13879"></a><span class="lineno">13879</span> {</div>
-<div class="line"><a name="l13880"></a><span class="lineno">13880</span>  <span class="keywordflow">if</span>(pStats)</div>
-<div class="line"><a name="l13881"></a><span class="lineno">13881</span>  {</div>
-<div class="line"><a name="l13882"></a><span class="lineno">13882</span>  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="l13883"></a><span class="lineno">13883</span>  }</div>
-<div class="line"><a name="l13884"></a><span class="lineno">13884</span>  </div>
-<div class="line"><a name="l13885"></a><span class="lineno">13885</span>  <span class="keywordflow">if</span>(commandBuffer == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l13886"></a><span class="lineno">13886</span>  {</div>
-<div class="line"><a name="l13887"></a><span class="lineno">13887</span>  maxGpuBytesToMove = 0;</div>
-<div class="line"><a name="l13888"></a><span class="lineno">13888</span>  maxGpuAllocationsToMove = 0;</div>
+<div class="line"><a name="l13762"></a><span class="lineno">13762</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13763"></a><span class="lineno">13763</span>  pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l13764"></a><span class="lineno">13764</span>  vma_delete(m_hAllocator, pBlockVectorCtx);</div>
+<div class="line"><a name="l13765"></a><span class="lineno">13765</span>  }</div>
+<div class="line"><a name="l13766"></a><span class="lineno">13766</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator->m_MemProps.memoryTypeCount; i--; )</div>
+<div class="line"><a name="l13767"></a><span class="lineno">13767</span>  {</div>
+<div class="line"><a name="l13768"></a><span class="lineno">13768</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div>
+<div class="line"><a name="l13769"></a><span class="lineno">13769</span>  <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l13770"></a><span class="lineno">13770</span>  {</div>
+<div class="line"><a name="l13771"></a><span class="lineno">13771</span>  pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l13772"></a><span class="lineno">13772</span>  vma_delete(m_hAllocator, pBlockVectorCtx);</div>
+<div class="line"><a name="l13773"></a><span class="lineno">13773</span>  }</div>
+<div class="line"><a name="l13774"></a><span class="lineno">13774</span>  }</div>
+<div class="line"><a name="l13775"></a><span class="lineno">13775</span> }</div>
+<div class="line"><a name="l13776"></a><span class="lineno">13776</span>  </div>
+<div class="line"><a name="l13777"></a><span class="lineno">13777</span> <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="l13778"></a><span class="lineno">13778</span> {</div>
+<div class="line"><a name="l13779"></a><span class="lineno">13779</span>  <span class="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex < poolCount; ++poolIndex)</div>
+<div class="line"><a name="l13780"></a><span class="lineno">13780</span>  {</div>
+<div class="line"><a name="l13781"></a><span class="lineno">13781</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div>
+<div class="line"><a name="l13782"></a><span class="lineno">13782</span>  VMA_ASSERT(pool);</div>
+<div class="line"><a name="l13783"></a><span class="lineno">13783</span>  <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l13784"></a><span class="lineno">13784</span>  <span class="keywordflow">if</span>(pool->m_BlockVector.GetAlgorithm() == 0)</div>
+<div class="line"><a name="l13785"></a><span class="lineno">13785</span>  {</div>
+<div class="line"><a name="l13786"></a><span class="lineno">13786</span>  VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
+<div class="line"><a name="l13787"></a><span class="lineno">13787</span>  </div>
+<div class="line"><a name="l13788"></a><span class="lineno">13788</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l13789"></a><span class="lineno">13789</span>  {</div>
+<div class="line"><a name="l13790"></a><span class="lineno">13790</span>  <span class="keywordflow">if</span>(m_CustomPoolContexts[i]->GetCustomPool() == pool)</div>
+<div class="line"><a name="l13791"></a><span class="lineno">13791</span>  {</div>
+<div class="line"><a name="l13792"></a><span class="lineno">13792</span>  pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13793"></a><span class="lineno">13793</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13794"></a><span class="lineno">13794</span>  }</div>
+<div class="line"><a name="l13795"></a><span class="lineno">13795</span>  }</div>
+<div class="line"><a name="l13796"></a><span class="lineno">13796</span>  </div>
+<div class="line"><a name="l13797"></a><span class="lineno">13797</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13798"></a><span class="lineno">13798</span>  {</div>
+<div class="line"><a name="l13799"></a><span class="lineno">13799</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13800"></a><span class="lineno">13800</span>  m_hAllocator,</div>
+<div class="line"><a name="l13801"></a><span class="lineno">13801</span>  pool,</div>
+<div class="line"><a name="l13802"></a><span class="lineno">13802</span>  &pool->m_BlockVector,</div>
+<div class="line"><a name="l13803"></a><span class="lineno">13803</span>  m_CurrFrameIndex);</div>
+<div class="line"><a name="l13804"></a><span class="lineno">13804</span>  m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
+<div class="line"><a name="l13805"></a><span class="lineno">13805</span>  }</div>
+<div class="line"><a name="l13806"></a><span class="lineno">13806</span>  </div>
+<div class="line"><a name="l13807"></a><span class="lineno">13807</span>  pBlockVectorDefragCtx->AddAll();</div>
+<div class="line"><a name="l13808"></a><span class="lineno">13808</span>  }</div>
+<div class="line"><a name="l13809"></a><span class="lineno">13809</span>  }</div>
+<div class="line"><a name="l13810"></a><span class="lineno">13810</span> }</div>
+<div class="line"><a name="l13811"></a><span class="lineno">13811</span>  </div>
+<div class="line"><a name="l13812"></a><span class="lineno">13812</span> <span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div>
+<div class="line"><a name="l13813"></a><span class="lineno">13813</span>  uint32_t allocationCount,</div>
+<div class="line"><a name="l13814"></a><span class="lineno">13814</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l13815"></a><span class="lineno">13815</span>  VkBool32* pAllocationsChanged)</div>
+<div class="line"><a name="l13816"></a><span class="lineno">13816</span> {</div>
+<div class="line"><a name="l13817"></a><span class="lineno">13817</span>  <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div>
+<div class="line"><a name="l13818"></a><span class="lineno">13818</span>  <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l13819"></a><span class="lineno">13819</span>  {</div>
+<div class="line"><a name="l13820"></a><span class="lineno">13820</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l13821"></a><span class="lineno">13821</span>  VMA_ASSERT(hAlloc);</div>
+<div class="line"><a name="l13822"></a><span class="lineno">13822</span>  <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div>
+<div class="line"><a name="l13823"></a><span class="lineno">13823</span>  <span class="keywordflow">if</span>((hAlloc->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &&</div>
+<div class="line"><a name="l13824"></a><span class="lineno">13824</span>  <span class="comment">// Lost allocation cannot be defragmented.</span></div>
+<div class="line"><a name="l13825"></a><span class="lineno">13825</span>  (hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div>
+<div class="line"><a name="l13826"></a><span class="lineno">13826</span>  {</div>
+<div class="line"><a name="l13827"></a><span class="lineno">13827</span>  VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
+<div class="line"><a name="l13828"></a><span class="lineno">13828</span>  </div>
+<div class="line"><a name="l13829"></a><span class="lineno">13829</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc->GetBlock()->GetParentPool();</div>
+<div class="line"><a name="l13830"></a><span class="lineno">13830</span>  <span class="comment">// This allocation belongs to custom pool.</span></div>
+<div class="line"><a name="l13831"></a><span class="lineno">13831</span>  <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l13832"></a><span class="lineno">13832</span>  {</div>
+<div class="line"><a name="l13833"></a><span class="lineno">13833</span>  <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l13834"></a><span class="lineno">13834</span>  <span class="keywordflow">if</span>(hAllocPool->m_BlockVector.GetAlgorithm() == 0)</div>
+<div class="line"><a name="l13835"></a><span class="lineno">13835</span>  {</div>
+<div class="line"><a name="l13836"></a><span class="lineno">13836</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l13837"></a><span class="lineno">13837</span>  {</div>
+<div class="line"><a name="l13838"></a><span class="lineno">13838</span>  <span class="keywordflow">if</span>(m_CustomPoolContexts[i]->GetCustomPool() == hAllocPool)</div>
+<div class="line"><a name="l13839"></a><span class="lineno">13839</span>  {</div>
+<div class="line"><a name="l13840"></a><span class="lineno">13840</span>  pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l13841"></a><span class="lineno">13841</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13842"></a><span class="lineno">13842</span>  }</div>
+<div class="line"><a name="l13843"></a><span class="lineno">13843</span>  }</div>
+<div class="line"><a name="l13844"></a><span class="lineno">13844</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13845"></a><span class="lineno">13845</span>  {</div>
+<div class="line"><a name="l13846"></a><span class="lineno">13846</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13847"></a><span class="lineno">13847</span>  m_hAllocator,</div>
+<div class="line"><a name="l13848"></a><span class="lineno">13848</span>  hAllocPool,</div>
+<div class="line"><a name="l13849"></a><span class="lineno">13849</span>  &hAllocPool->m_BlockVector,</div>
+<div class="line"><a name="l13850"></a><span class="lineno">13850</span>  m_CurrFrameIndex);</div>
+<div class="line"><a name="l13851"></a><span class="lineno">13851</span>  m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
+<div class="line"><a name="l13852"></a><span class="lineno">13852</span>  }</div>
+<div class="line"><a name="l13853"></a><span class="lineno">13853</span>  }</div>
+<div class="line"><a name="l13854"></a><span class="lineno">13854</span>  }</div>
+<div class="line"><a name="l13855"></a><span class="lineno">13855</span>  <span class="comment">// This allocation belongs to default pool.</span></div>
+<div class="line"><a name="l13856"></a><span class="lineno">13856</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13857"></a><span class="lineno">13857</span>  {</div>
+<div class="line"><a name="l13858"></a><span class="lineno">13858</span>  <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l13859"></a><span class="lineno">13859</span>  pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l13860"></a><span class="lineno">13860</span>  <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13861"></a><span class="lineno">13861</span>  {</div>
+<div class="line"><a name="l13862"></a><span class="lineno">13862</span>  pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l13863"></a><span class="lineno">13863</span>  m_hAllocator,</div>
+<div class="line"><a name="l13864"></a><span class="lineno">13864</span>  VMA_NULL, <span class="comment">// hCustomPool</span></div>
+<div class="line"><a name="l13865"></a><span class="lineno">13865</span>  m_hAllocator->m_pBlockVectors[memTypeIndex],</div>
+<div class="line"><a name="l13866"></a><span class="lineno">13866</span>  m_CurrFrameIndex);</div>
+<div class="line"><a name="l13867"></a><span class="lineno">13867</span>  m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</div>
+<div class="line"><a name="l13868"></a><span class="lineno">13868</span>  }</div>
+<div class="line"><a name="l13869"></a><span class="lineno">13869</span>  }</div>
+<div class="line"><a name="l13870"></a><span class="lineno">13870</span>  </div>
+<div class="line"><a name="l13871"></a><span class="lineno">13871</span>  <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l13872"></a><span class="lineno">13872</span>  {</div>
+<div class="line"><a name="l13873"></a><span class="lineno">13873</span>  VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div>
+<div class="line"><a name="l13874"></a><span class="lineno">13874</span>  &pAllocationsChanged[allocIndex] : VMA_NULL;</div>
+<div class="line"><a name="l13875"></a><span class="lineno">13875</span>  pBlockVectorDefragCtx->AddAllocation(hAlloc, pChanged);</div>
+<div class="line"><a name="l13876"></a><span class="lineno">13876</span>  }</div>
+<div class="line"><a name="l13877"></a><span class="lineno">13877</span>  }</div>
+<div class="line"><a name="l13878"></a><span class="lineno">13878</span>  }</div>
+<div class="line"><a name="l13879"></a><span class="lineno">13879</span> }</div>
+<div class="line"><a name="l13880"></a><span class="lineno">13880</span>  </div>
+<div class="line"><a name="l13881"></a><span class="lineno">13881</span> VkResult VmaDefragmentationContext_T::Defragment(</div>
+<div class="line"><a name="l13882"></a><span class="lineno">13882</span>  VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13883"></a><span class="lineno">13883</span>  VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13884"></a><span class="lineno">13884</span>  VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
+<div class="line"><a name="l13885"></a><span class="lineno">13885</span> {</div>
+<div class="line"><a name="l13886"></a><span class="lineno">13886</span>  <span class="keywordflow">if</span>(pStats)</div>
+<div class="line"><a name="l13887"></a><span class="lineno">13887</span>  {</div>
+<div class="line"><a name="l13888"></a><span class="lineno">13888</span>  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="l13889"></a><span class="lineno">13889</span>  }</div>
<div class="line"><a name="l13890"></a><span class="lineno">13890</span>  </div>
-<div class="line"><a name="l13891"></a><span class="lineno">13891</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l13892"></a><span class="lineno">13892</span>  </div>
-<div class="line"><a name="l13893"></a><span class="lineno">13893</span>  <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l13894"></a><span class="lineno">13894</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
-<div class="line"><a name="l13895"></a><span class="lineno">13895</span>  memTypeIndex < m_hAllocator->GetMemoryTypeCount() && res >= VK_SUCCESS;</div>
-<div class="line"><a name="l13896"></a><span class="lineno">13896</span>  ++memTypeIndex)</div>
-<div class="line"><a name="l13897"></a><span class="lineno">13897</span>  {</div>
-<div class="line"><a name="l13898"></a><span class="lineno">13898</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l13899"></a><span class="lineno">13899</span>  <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l13900"></a><span class="lineno">13900</span>  {</div>
-<div class="line"><a name="l13901"></a><span class="lineno">13901</span>  VMA_ASSERT(pBlockVectorCtx->GetBlockVector());</div>
-<div class="line"><a name="l13902"></a><span class="lineno">13902</span>  pBlockVectorCtx->GetBlockVector()->Defragment(</div>
-<div class="line"><a name="l13903"></a><span class="lineno">13903</span>  pBlockVectorCtx,</div>
-<div class="line"><a name="l13904"></a><span class="lineno">13904</span>  pStats,</div>
-<div class="line"><a name="l13905"></a><span class="lineno">13905</span>  maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l13906"></a><span class="lineno">13906</span>  maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l13907"></a><span class="lineno">13907</span>  commandBuffer);</div>
-<div class="line"><a name="l13908"></a><span class="lineno">13908</span>  <span class="keywordflow">if</span>(pBlockVectorCtx->res != VK_SUCCESS)</div>
-<div class="line"><a name="l13909"></a><span class="lineno">13909</span>  {</div>
-<div class="line"><a name="l13910"></a><span class="lineno">13910</span>  res = pBlockVectorCtx->res;</div>
-<div class="line"><a name="l13911"></a><span class="lineno">13911</span>  }</div>
-<div class="line"><a name="l13912"></a><span class="lineno">13912</span>  }</div>
-<div class="line"><a name="l13913"></a><span class="lineno">13913</span>  }</div>
-<div class="line"><a name="l13914"></a><span class="lineno">13914</span>  </div>
-<div class="line"><a name="l13915"></a><span class="lineno">13915</span>  <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l13916"></a><span class="lineno">13916</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
-<div class="line"><a name="l13917"></a><span class="lineno">13917</span>  customCtxIndex < customCtxCount && res >= VK_SUCCESS;</div>
-<div class="line"><a name="l13918"></a><span class="lineno">13918</span>  ++customCtxIndex)</div>
-<div class="line"><a name="l13919"></a><span class="lineno">13919</span>  {</div>
-<div class="line"><a name="l13920"></a><span class="lineno">13920</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
-<div class="line"><a name="l13921"></a><span class="lineno">13921</span>  VMA_ASSERT(pBlockVectorCtx && pBlockVectorCtx->GetBlockVector());</div>
-<div class="line"><a name="l13922"></a><span class="lineno">13922</span>  pBlockVectorCtx->GetBlockVector()->Defragment(</div>
-<div class="line"><a name="l13923"></a><span class="lineno">13923</span>  pBlockVectorCtx,</div>
-<div class="line"><a name="l13924"></a><span class="lineno">13924</span>  pStats,</div>
-<div class="line"><a name="l13925"></a><span class="lineno">13925</span>  maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l13926"></a><span class="lineno">13926</span>  maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l13927"></a><span class="lineno">13927</span>  commandBuffer);</div>
-<div class="line"><a name="l13928"></a><span class="lineno">13928</span>  <span class="keywordflow">if</span>(pBlockVectorCtx->res != VK_SUCCESS)</div>
-<div class="line"><a name="l13929"></a><span class="lineno">13929</span>  {</div>
-<div class="line"><a name="l13930"></a><span class="lineno">13930</span>  res = pBlockVectorCtx->res;</div>
-<div class="line"><a name="l13931"></a><span class="lineno">13931</span>  }</div>
-<div class="line"><a name="l13932"></a><span class="lineno">13932</span>  }</div>
-<div class="line"><a name="l13933"></a><span class="lineno">13933</span>  </div>
-<div class="line"><a name="l13934"></a><span class="lineno">13934</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l13935"></a><span class="lineno">13935</span> }</div>
-<div class="line"><a name="l13936"></a><span class="lineno">13936</span>  </div>
-<div class="line"><a name="l13938"></a><span class="lineno">13938</span> <span class="comment">// VmaRecorder</span></div>
+<div class="line"><a name="l13891"></a><span class="lineno">13891</span>  <span class="keywordflow">if</span>(commandBuffer == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l13892"></a><span class="lineno">13892</span>  {</div>
+<div class="line"><a name="l13893"></a><span class="lineno">13893</span>  maxGpuBytesToMove = 0;</div>
+<div class="line"><a name="l13894"></a><span class="lineno">13894</span>  maxGpuAllocationsToMove = 0;</div>
+<div class="line"><a name="l13895"></a><span class="lineno">13895</span>  }</div>
+<div class="line"><a name="l13896"></a><span class="lineno">13896</span>  </div>
+<div class="line"><a name="l13897"></a><span class="lineno">13897</span>  VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l13898"></a><span class="lineno">13898</span>  </div>
+<div class="line"><a name="l13899"></a><span class="lineno">13899</span>  <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l13900"></a><span class="lineno">13900</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
+<div class="line"><a name="l13901"></a><span class="lineno">13901</span>  memTypeIndex < m_hAllocator->GetMemoryTypeCount() && res >= VK_SUCCESS;</div>
+<div class="line"><a name="l13902"></a><span class="lineno">13902</span>  ++memTypeIndex)</div>
+<div class="line"><a name="l13903"></a><span class="lineno">13903</span>  {</div>
+<div class="line"><a name="l13904"></a><span class="lineno">13904</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l13905"></a><span class="lineno">13905</span>  <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l13906"></a><span class="lineno">13906</span>  {</div>
+<div class="line"><a name="l13907"></a><span class="lineno">13907</span>  VMA_ASSERT(pBlockVectorCtx->GetBlockVector());</div>
+<div class="line"><a name="l13908"></a><span class="lineno">13908</span>  pBlockVectorCtx->GetBlockVector()->Defragment(</div>
+<div class="line"><a name="l13909"></a><span class="lineno">13909</span>  pBlockVectorCtx,</div>
+<div class="line"><a name="l13910"></a><span class="lineno">13910</span>  pStats,</div>
+<div class="line"><a name="l13911"></a><span class="lineno">13911</span>  maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13912"></a><span class="lineno">13912</span>  maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13913"></a><span class="lineno">13913</span>  commandBuffer);</div>
+<div class="line"><a name="l13914"></a><span class="lineno">13914</span>  <span class="keywordflow">if</span>(pBlockVectorCtx->res != VK_SUCCESS)</div>
+<div class="line"><a name="l13915"></a><span class="lineno">13915</span>  {</div>
+<div class="line"><a name="l13916"></a><span class="lineno">13916</span>  res = pBlockVectorCtx->res;</div>
+<div class="line"><a name="l13917"></a><span class="lineno">13917</span>  }</div>
+<div class="line"><a name="l13918"></a><span class="lineno">13918</span>  }</div>
+<div class="line"><a name="l13919"></a><span class="lineno">13919</span>  }</div>
+<div class="line"><a name="l13920"></a><span class="lineno">13920</span>  </div>
+<div class="line"><a name="l13921"></a><span class="lineno">13921</span>  <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l13922"></a><span class="lineno">13922</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
+<div class="line"><a name="l13923"></a><span class="lineno">13923</span>  customCtxIndex < customCtxCount && res >= VK_SUCCESS;</div>
+<div class="line"><a name="l13924"></a><span class="lineno">13924</span>  ++customCtxIndex)</div>
+<div class="line"><a name="l13925"></a><span class="lineno">13925</span>  {</div>
+<div class="line"><a name="l13926"></a><span class="lineno">13926</span>  VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
+<div class="line"><a name="l13927"></a><span class="lineno">13927</span>  VMA_ASSERT(pBlockVectorCtx && pBlockVectorCtx->GetBlockVector());</div>
+<div class="line"><a name="l13928"></a><span class="lineno">13928</span>  pBlockVectorCtx->GetBlockVector()->Defragment(</div>
+<div class="line"><a name="l13929"></a><span class="lineno">13929</span>  pBlockVectorCtx,</div>
+<div class="line"><a name="l13930"></a><span class="lineno">13930</span>  pStats,</div>
+<div class="line"><a name="l13931"></a><span class="lineno">13931</span>  maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13932"></a><span class="lineno">13932</span>  maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13933"></a><span class="lineno">13933</span>  commandBuffer);</div>
+<div class="line"><a name="l13934"></a><span class="lineno">13934</span>  <span class="keywordflow">if</span>(pBlockVectorCtx->res != VK_SUCCESS)</div>
+<div class="line"><a name="l13935"></a><span class="lineno">13935</span>  {</div>
+<div class="line"><a name="l13936"></a><span class="lineno">13936</span>  res = pBlockVectorCtx->res;</div>
+<div class="line"><a name="l13937"></a><span class="lineno">13937</span>  }</div>
+<div class="line"><a name="l13938"></a><span class="lineno">13938</span>  }</div>
<div class="line"><a name="l13939"></a><span class="lineno">13939</span>  </div>
-<div class="line"><a name="l13940"></a><span class="lineno">13940</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l13941"></a><span class="lineno">13941</span>  </div>
-<div class="line"><a name="l13942"></a><span class="lineno">13942</span> VmaRecorder::VmaRecorder() :</div>
-<div class="line"><a name="l13943"></a><span class="lineno">13943</span>  m_UseMutex(true),</div>
-<div class="line"><a name="l13944"></a><span class="lineno">13944</span>  m_Flags(0),</div>
-<div class="line"><a name="l13945"></a><span class="lineno">13945</span>  m_File(VMA_NULL),</div>
-<div class="line"><a name="l13946"></a><span class="lineno">13946</span>  m_Freq(INT64_MAX),</div>
-<div class="line"><a name="l13947"></a><span class="lineno">13947</span>  m_StartCounter(INT64_MAX)</div>
-<div class="line"><a name="l13948"></a><span class="lineno">13948</span> {</div>
-<div class="line"><a name="l13949"></a><span class="lineno">13949</span> }</div>
-<div class="line"><a name="l13950"></a><span class="lineno">13950</span>  </div>
-<div class="line"><a name="l13951"></a><span class="lineno">13951</span> VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>& settings, <span class="keywordtype">bool</span> useMutex)</div>
-<div class="line"><a name="l13952"></a><span class="lineno">13952</span> {</div>
-<div class="line"><a name="l13953"></a><span class="lineno">13953</span>  m_UseMutex = useMutex;</div>
-<div class="line"><a name="l13954"></a><span class="lineno">13954</span>  m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
-<div class="line"><a name="l13955"></a><span class="lineno">13955</span>  </div>
-<div class="line"><a name="l13956"></a><span class="lineno">13956</span>  QueryPerformanceFrequency((LARGE_INTEGER*)&m_Freq);</div>
-<div class="line"><a name="l13957"></a><span class="lineno">13957</span>  QueryPerformanceCounter((LARGE_INTEGER*)&m_StartCounter);</div>
-<div class="line"><a name="l13958"></a><span class="lineno">13958</span>  </div>
-<div class="line"><a name="l13959"></a><span class="lineno">13959</span>  <span class="comment">// Open file for writing.</span></div>
-<div class="line"><a name="l13960"></a><span class="lineno">13960</span>  errno_t err = fopen_s(&m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">"wb"</span>);</div>
-<div class="line"><a name="l13961"></a><span class="lineno">13961</span>  <span class="keywordflow">if</span>(err != 0)</div>
-<div class="line"><a name="l13962"></a><span class="lineno">13962</span>  {</div>
-<div class="line"><a name="l13963"></a><span class="lineno">13963</span>  <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l13964"></a><span class="lineno">13964</span>  }</div>
-<div class="line"><a name="l13965"></a><span class="lineno">13965</span>  </div>
-<div class="line"><a name="l13966"></a><span class="lineno">13966</span>  <span class="comment">// Write header.</span></div>
-<div class="line"><a name="l13967"></a><span class="lineno">13967</span>  fprintf(m_File, <span class="stringliteral">"%s\n"</span>, <span class="stringliteral">"Vulkan Memory Allocator,Calls recording"</span>);</div>
-<div class="line"><a name="l13968"></a><span class="lineno">13968</span>  fprintf(m_File, <span class="stringliteral">"%s\n"</span>, <span class="stringliteral">"1,8"</span>);</div>
-<div class="line"><a name="l13969"></a><span class="lineno">13969</span>  </div>
-<div class="line"><a name="l13970"></a><span class="lineno">13970</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13971"></a><span class="lineno">13971</span> }</div>
-<div class="line"><a name="l13972"></a><span class="lineno">13972</span>  </div>
-<div class="line"><a name="l13973"></a><span class="lineno">13973</span> VmaRecorder::~VmaRecorder()</div>
-<div class="line"><a name="l13974"></a><span class="lineno">13974</span> {</div>
-<div class="line"><a name="l13975"></a><span class="lineno">13975</span>  <span class="keywordflow">if</span>(m_File != VMA_NULL)</div>
-<div class="line"><a name="l13976"></a><span class="lineno">13976</span>  {</div>
-<div class="line"><a name="l13977"></a><span class="lineno">13977</span>  fclose(m_File);</div>
-<div class="line"><a name="l13978"></a><span class="lineno">13978</span>  }</div>
-<div class="line"><a name="l13979"></a><span class="lineno">13979</span> }</div>
-<div class="line"><a name="l13980"></a><span class="lineno">13980</span>  </div>
-<div class="line"><a name="l13981"></a><span class="lineno">13981</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div>
-<div class="line"><a name="l13982"></a><span class="lineno">13982</span> {</div>
-<div class="line"><a name="l13983"></a><span class="lineno">13983</span>  CallParams callParams;</div>
-<div class="line"><a name="l13984"></a><span class="lineno">13984</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l13985"></a><span class="lineno">13985</span>  </div>
-<div class="line"><a name="l13986"></a><span class="lineno">13986</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l13987"></a><span class="lineno">13987</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateAllocator\n"</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l13988"></a><span class="lineno">13988</span>  Flush();</div>
-<div class="line"><a name="l13989"></a><span class="lineno">13989</span> }</div>
-<div class="line"><a name="l13990"></a><span class="lineno">13990</span>  </div>
-<div class="line"><a name="l13991"></a><span class="lineno">13991</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div>
-<div class="line"><a name="l13992"></a><span class="lineno">13992</span> {</div>
-<div class="line"><a name="l13993"></a><span class="lineno">13993</span>  CallParams callParams;</div>
-<div class="line"><a name="l13994"></a><span class="lineno">13994</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l13995"></a><span class="lineno">13995</span>  </div>
-<div class="line"><a name="l13996"></a><span class="lineno">13996</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l13997"></a><span class="lineno">13997</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyAllocator\n"</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l13998"></a><span class="lineno">13998</span>  Flush();</div>
-<div class="line"><a name="l13999"></a><span class="lineno">13999</span> }</div>
-<div class="line"><a name="l14000"></a><span class="lineno">14000</span>  </div>
-<div class="line"><a name="l14001"></a><span class="lineno">14001</span> <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>& createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l14002"></a><span class="lineno">14002</span> {</div>
-<div class="line"><a name="l14003"></a><span class="lineno">14003</span>  CallParams callParams;</div>
-<div class="line"><a name="l14004"></a><span class="lineno">14004</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14005"></a><span class="lineno">14005</span>  </div>
-<div class="line"><a name="l14006"></a><span class="lineno">14006</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14007"></a><span class="lineno">14007</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14008"></a><span class="lineno">14008</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div>
-<div class="line"><a name="l14009"></a><span class="lineno">14009</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div>
-<div class="line"><a name="l14010"></a><span class="lineno">14010</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div>
-<div class="line"><a name="l14011"></a><span class="lineno">14011</span>  (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div>
-<div class="line"><a name="l14012"></a><span class="lineno">14012</span>  (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div>
-<div class="line"><a name="l14013"></a><span class="lineno">14013</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div>
-<div class="line"><a name="l14014"></a><span class="lineno">14014</span>  pool);</div>
-<div class="line"><a name="l14015"></a><span class="lineno">14015</span>  Flush();</div>
-<div class="line"><a name="l14016"></a><span class="lineno">14016</span> }</div>
-<div class="line"><a name="l14017"></a><span class="lineno">14017</span>  </div>
-<div class="line"><a name="l14018"></a><span class="lineno">14018</span> <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="l14019"></a><span class="lineno">14019</span> {</div>
-<div class="line"><a name="l14020"></a><span class="lineno">14020</span>  CallParams callParams;</div>
-<div class="line"><a name="l14021"></a><span class="lineno">14021</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14022"></a><span class="lineno">14022</span>  </div>
-<div class="line"><a name="l14023"></a><span class="lineno">14023</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14024"></a><span class="lineno">14024</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyPool,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14025"></a><span class="lineno">14025</span>  pool);</div>
-<div class="line"><a name="l14026"></a><span class="lineno">14026</span>  Flush();</div>
-<div class="line"><a name="l14027"></a><span class="lineno">14027</span> }</div>
+<div class="line"><a name="l13940"></a><span class="lineno">13940</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l13941"></a><span class="lineno">13941</span> }</div>
+<div class="line"><a name="l13942"></a><span class="lineno">13942</span>  </div>
+<div class="line"><a name="l13944"></a><span class="lineno">13944</span> <span class="comment">// VmaRecorder</span></div>
+<div class="line"><a name="l13945"></a><span class="lineno">13945</span>  </div>
+<div class="line"><a name="l13946"></a><span class="lineno">13946</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l13947"></a><span class="lineno">13947</span>  </div>
+<div class="line"><a name="l13948"></a><span class="lineno">13948</span> VmaRecorder::VmaRecorder() :</div>
+<div class="line"><a name="l13949"></a><span class="lineno">13949</span>  m_UseMutex(true),</div>
+<div class="line"><a name="l13950"></a><span class="lineno">13950</span>  m_Flags(0),</div>
+<div class="line"><a name="l13951"></a><span class="lineno">13951</span>  m_File(VMA_NULL),</div>
+<div class="line"><a name="l13952"></a><span class="lineno">13952</span>  m_Freq(INT64_MAX),</div>
+<div class="line"><a name="l13953"></a><span class="lineno">13953</span>  m_StartCounter(INT64_MAX)</div>
+<div class="line"><a name="l13954"></a><span class="lineno">13954</span> {</div>
+<div class="line"><a name="l13955"></a><span class="lineno">13955</span> }</div>
+<div class="line"><a name="l13956"></a><span class="lineno">13956</span>  </div>
+<div class="line"><a name="l13957"></a><span class="lineno">13957</span> VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>& settings, <span class="keywordtype">bool</span> useMutex)</div>
+<div class="line"><a name="l13958"></a><span class="lineno">13958</span> {</div>
+<div class="line"><a name="l13959"></a><span class="lineno">13959</span>  m_UseMutex = useMutex;</div>
+<div class="line"><a name="l13960"></a><span class="lineno">13960</span>  m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
+<div class="line"><a name="l13961"></a><span class="lineno">13961</span>  </div>
+<div class="line"><a name="l13962"></a><span class="lineno">13962</span>  QueryPerformanceFrequency((LARGE_INTEGER*)&m_Freq);</div>
+<div class="line"><a name="l13963"></a><span class="lineno">13963</span>  QueryPerformanceCounter((LARGE_INTEGER*)&m_StartCounter);</div>
+<div class="line"><a name="l13964"></a><span class="lineno">13964</span>  </div>
+<div class="line"><a name="l13965"></a><span class="lineno">13965</span>  <span class="comment">// Open file for writing.</span></div>
+<div class="line"><a name="l13966"></a><span class="lineno">13966</span>  errno_t err = fopen_s(&m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">"wb"</span>);</div>
+<div class="line"><a name="l13967"></a><span class="lineno">13967</span>  <span class="keywordflow">if</span>(err != 0)</div>
+<div class="line"><a name="l13968"></a><span class="lineno">13968</span>  {</div>
+<div class="line"><a name="l13969"></a><span class="lineno">13969</span>  <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l13970"></a><span class="lineno">13970</span>  }</div>
+<div class="line"><a name="l13971"></a><span class="lineno">13971</span>  </div>
+<div class="line"><a name="l13972"></a><span class="lineno">13972</span>  <span class="comment">// Write header.</span></div>
+<div class="line"><a name="l13973"></a><span class="lineno">13973</span>  fprintf(m_File, <span class="stringliteral">"%s\n"</span>, <span class="stringliteral">"Vulkan Memory Allocator,Calls recording"</span>);</div>
+<div class="line"><a name="l13974"></a><span class="lineno">13974</span>  fprintf(m_File, <span class="stringliteral">"%s\n"</span>, <span class="stringliteral">"1,8"</span>);</div>
+<div class="line"><a name="l13975"></a><span class="lineno">13975</span>  </div>
+<div class="line"><a name="l13976"></a><span class="lineno">13976</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13977"></a><span class="lineno">13977</span> }</div>
+<div class="line"><a name="l13978"></a><span class="lineno">13978</span>  </div>
+<div class="line"><a name="l13979"></a><span class="lineno">13979</span> VmaRecorder::~VmaRecorder()</div>
+<div class="line"><a name="l13980"></a><span class="lineno">13980</span> {</div>
+<div class="line"><a name="l13981"></a><span class="lineno">13981</span>  <span class="keywordflow">if</span>(m_File != VMA_NULL)</div>
+<div class="line"><a name="l13982"></a><span class="lineno">13982</span>  {</div>
+<div class="line"><a name="l13983"></a><span class="lineno">13983</span>  fclose(m_File);</div>
+<div class="line"><a name="l13984"></a><span class="lineno">13984</span>  }</div>
+<div class="line"><a name="l13985"></a><span class="lineno">13985</span> }</div>
+<div class="line"><a name="l13986"></a><span class="lineno">13986</span>  </div>
+<div class="line"><a name="l13987"></a><span class="lineno">13987</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l13988"></a><span class="lineno">13988</span> {</div>
+<div class="line"><a name="l13989"></a><span class="lineno">13989</span>  CallParams callParams;</div>
+<div class="line"><a name="l13990"></a><span class="lineno">13990</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l13991"></a><span class="lineno">13991</span>  </div>
+<div class="line"><a name="l13992"></a><span class="lineno">13992</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l13993"></a><span class="lineno">13993</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateAllocator\n"</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l13994"></a><span class="lineno">13994</span>  Flush();</div>
+<div class="line"><a name="l13995"></a><span class="lineno">13995</span> }</div>
+<div class="line"><a name="l13996"></a><span class="lineno">13996</span>  </div>
+<div class="line"><a name="l13997"></a><span class="lineno">13997</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l13998"></a><span class="lineno">13998</span> {</div>
+<div class="line"><a name="l13999"></a><span class="lineno">13999</span>  CallParams callParams;</div>
+<div class="line"><a name="l14000"></a><span class="lineno">14000</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14001"></a><span class="lineno">14001</span>  </div>
+<div class="line"><a name="l14002"></a><span class="lineno">14002</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14003"></a><span class="lineno">14003</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyAllocator\n"</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l14004"></a><span class="lineno">14004</span>  Flush();</div>
+<div class="line"><a name="l14005"></a><span class="lineno">14005</span> }</div>
+<div class="line"><a name="l14006"></a><span class="lineno">14006</span>  </div>
+<div class="line"><a name="l14007"></a><span class="lineno">14007</span> <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>& createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l14008"></a><span class="lineno">14008</span> {</div>
+<div class="line"><a name="l14009"></a><span class="lineno">14009</span>  CallParams callParams;</div>
+<div class="line"><a name="l14010"></a><span class="lineno">14010</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14011"></a><span class="lineno">14011</span>  </div>
+<div class="line"><a name="l14012"></a><span class="lineno">14012</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14013"></a><span class="lineno">14013</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14014"></a><span class="lineno">14014</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div>
+<div class="line"><a name="l14015"></a><span class="lineno">14015</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div>
+<div class="line"><a name="l14016"></a><span class="lineno">14016</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div>
+<div class="line"><a name="l14017"></a><span class="lineno">14017</span>  (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div>
+<div class="line"><a name="l14018"></a><span class="lineno">14018</span>  (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div>
+<div class="line"><a name="l14019"></a><span class="lineno">14019</span>  createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div>
+<div class="line"><a name="l14020"></a><span class="lineno">14020</span>  pool);</div>
+<div class="line"><a name="l14021"></a><span class="lineno">14021</span>  Flush();</div>
+<div class="line"><a name="l14022"></a><span class="lineno">14022</span> }</div>
+<div class="line"><a name="l14023"></a><span class="lineno">14023</span>  </div>
+<div class="line"><a name="l14024"></a><span class="lineno">14024</span> <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="l14025"></a><span class="lineno">14025</span> {</div>
+<div class="line"><a name="l14026"></a><span class="lineno">14026</span>  CallParams callParams;</div>
+<div class="line"><a name="l14027"></a><span class="lineno">14027</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14028"></a><span class="lineno">14028</span>  </div>
-<div class="line"><a name="l14029"></a><span class="lineno">14029</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l14030"></a><span class="lineno">14030</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
-<div class="line"><a name="l14031"></a><span class="lineno">14031</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l14032"></a><span class="lineno">14032</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14033"></a><span class="lineno">14033</span> {</div>
-<div class="line"><a name="l14034"></a><span class="lineno">14034</span>  CallParams callParams;</div>
-<div class="line"><a name="l14035"></a><span class="lineno">14035</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14036"></a><span class="lineno">14036</span>  </div>
-<div class="line"><a name="l14037"></a><span class="lineno">14037</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14038"></a><span class="lineno">14038</span>  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="l14039"></a><span class="lineno">14039</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14040"></a><span class="lineno">14040</span>  vkMemReq.size,</div>
-<div class="line"><a name="l14041"></a><span class="lineno">14041</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l14042"></a><span class="lineno">14042</span>  vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14043"></a><span class="lineno">14043</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14044"></a><span class="lineno">14044</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14045"></a><span class="lineno">14045</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14046"></a><span class="lineno">14046</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14047"></a><span class="lineno">14047</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14048"></a><span class="lineno">14048</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14049"></a><span class="lineno">14049</span>  allocation,</div>
-<div class="line"><a name="l14050"></a><span class="lineno">14050</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14051"></a><span class="lineno">14051</span>  Flush();</div>
-<div class="line"><a name="l14052"></a><span class="lineno">14052</span> }</div>
-<div class="line"><a name="l14053"></a><span class="lineno">14053</span>  </div>
-<div class="line"><a name="l14054"></a><span class="lineno">14054</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l14055"></a><span class="lineno">14055</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
-<div class="line"><a name="l14056"></a><span class="lineno">14056</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l14057"></a><span class="lineno">14057</span>  uint64_t allocationCount,</div>
-<div class="line"><a name="l14058"></a><span class="lineno">14058</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l14059"></a><span class="lineno">14059</span> {</div>
-<div class="line"><a name="l14060"></a><span class="lineno">14060</span>  CallParams callParams;</div>
-<div class="line"><a name="l14061"></a><span class="lineno">14061</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14062"></a><span class="lineno">14062</span>  </div>
-<div class="line"><a name="l14063"></a><span class="lineno">14063</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14064"></a><span class="lineno">14064</span>  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="l14065"></a><span class="lineno">14065</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14066"></a><span class="lineno">14066</span>  vkMemReq.size,</div>
-<div class="line"><a name="l14067"></a><span class="lineno">14067</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l14068"></a><span class="lineno">14068</span>  vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14069"></a><span class="lineno">14069</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14070"></a><span class="lineno">14070</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14071"></a><span class="lineno">14071</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14072"></a><span class="lineno">14072</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14073"></a><span class="lineno">14073</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14074"></a><span class="lineno">14074</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div>
-<div class="line"><a name="l14075"></a><span class="lineno">14075</span>  PrintPointerList(allocationCount, pAllocations);</div>
-<div class="line"><a name="l14076"></a><span class="lineno">14076</span>  fprintf(m_File, <span class="stringliteral">",%s\n"</span>, userDataStr.GetString());</div>
-<div class="line"><a name="l14077"></a><span class="lineno">14077</span>  Flush();</div>
-<div class="line"><a name="l14078"></a><span class="lineno">14078</span> }</div>
-<div class="line"><a name="l14079"></a><span class="lineno">14079</span>  </div>
-<div class="line"><a name="l14080"></a><span class="lineno">14080</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l14081"></a><span class="lineno">14081</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
-<div class="line"><a name="l14082"></a><span class="lineno">14082</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l14083"></a><span class="lineno">14083</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l14084"></a><span class="lineno">14084</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l14085"></a><span class="lineno">14085</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14086"></a><span class="lineno">14086</span> {</div>
-<div class="line"><a name="l14087"></a><span class="lineno">14087</span>  CallParams callParams;</div>
-<div class="line"><a name="l14088"></a><span class="lineno">14088</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14089"></a><span class="lineno">14089</span>  </div>
-<div class="line"><a name="l14090"></a><span class="lineno">14090</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14091"></a><span class="lineno">14091</span>  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="l14092"></a><span class="lineno">14092</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14093"></a><span class="lineno">14093</span>  vkMemReq.size,</div>
-<div class="line"><a name="l14094"></a><span class="lineno">14094</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l14095"></a><span class="lineno">14095</span>  vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14096"></a><span class="lineno">14096</span>  requiresDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l14097"></a><span class="lineno">14097</span>  prefersDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l14098"></a><span class="lineno">14098</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14099"></a><span class="lineno">14099</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14100"></a><span class="lineno">14100</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14101"></a><span class="lineno">14101</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14102"></a><span class="lineno">14102</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14103"></a><span class="lineno">14103</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14104"></a><span class="lineno">14104</span>  allocation,</div>
-<div class="line"><a name="l14105"></a><span class="lineno">14105</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14106"></a><span class="lineno">14106</span>  Flush();</div>
-<div class="line"><a name="l14107"></a><span class="lineno">14107</span> }</div>
-<div class="line"><a name="l14108"></a><span class="lineno">14108</span>  </div>
-<div class="line"><a name="l14109"></a><span class="lineno">14109</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l14110"></a><span class="lineno">14110</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
-<div class="line"><a name="l14111"></a><span class="lineno">14111</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l14112"></a><span class="lineno">14112</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l14113"></a><span class="lineno">14113</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l14114"></a><span class="lineno">14114</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14115"></a><span class="lineno">14115</span> {</div>
-<div class="line"><a name="l14116"></a><span class="lineno">14116</span>  CallParams callParams;</div>
-<div class="line"><a name="l14117"></a><span class="lineno">14117</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14118"></a><span class="lineno">14118</span>  </div>
-<div class="line"><a name="l14119"></a><span class="lineno">14119</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14120"></a><span class="lineno">14120</span>  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="l14121"></a><span class="lineno">14121</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14122"></a><span class="lineno">14122</span>  vkMemReq.size,</div>
-<div class="line"><a name="l14123"></a><span class="lineno">14123</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l14124"></a><span class="lineno">14124</span>  vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14125"></a><span class="lineno">14125</span>  requiresDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l14126"></a><span class="lineno">14126</span>  prefersDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l14127"></a><span class="lineno">14127</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14128"></a><span class="lineno">14128</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14129"></a><span class="lineno">14129</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14130"></a><span class="lineno">14130</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14131"></a><span class="lineno">14131</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14132"></a><span class="lineno">14132</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14133"></a><span class="lineno">14133</span>  allocation,</div>
-<div class="line"><a name="l14134"></a><span class="lineno">14134</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14135"></a><span class="lineno">14135</span>  Flush();</div>
-<div class="line"><a name="l14136"></a><span class="lineno">14136</span> }</div>
-<div class="line"><a name="l14137"></a><span class="lineno">14137</span>  </div>
-<div class="line"><a name="l14138"></a><span class="lineno">14138</span> <span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l14139"></a><span class="lineno">14139</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14140"></a><span class="lineno">14140</span> {</div>
-<div class="line"><a name="l14141"></a><span class="lineno">14141</span>  CallParams callParams;</div>
-<div class="line"><a name="l14142"></a><span class="lineno">14142</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14029"></a><span class="lineno">14029</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14030"></a><span class="lineno">14030</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyPool,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14031"></a><span class="lineno">14031</span>  pool);</div>
+<div class="line"><a name="l14032"></a><span class="lineno">14032</span>  Flush();</div>
+<div class="line"><a name="l14033"></a><span class="lineno">14033</span> }</div>
+<div class="line"><a name="l14034"></a><span class="lineno">14034</span>  </div>
+<div class="line"><a name="l14035"></a><span class="lineno">14035</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l14036"></a><span class="lineno">14036</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
+<div class="line"><a name="l14037"></a><span class="lineno">14037</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l14038"></a><span class="lineno">14038</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14039"></a><span class="lineno">14039</span> {</div>
+<div class="line"><a name="l14040"></a><span class="lineno">14040</span>  CallParams callParams;</div>
+<div class="line"><a name="l14041"></a><span class="lineno">14041</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14042"></a><span class="lineno">14042</span>  </div>
+<div class="line"><a name="l14043"></a><span class="lineno">14043</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14044"></a><span class="lineno">14044</span>  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="l14045"></a><span class="lineno">14045</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14046"></a><span class="lineno">14046</span>  vkMemReq.size,</div>
+<div class="line"><a name="l14047"></a><span class="lineno">14047</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l14048"></a><span class="lineno">14048</span>  vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l14049"></a><span class="lineno">14049</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14050"></a><span class="lineno">14050</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14051"></a><span class="lineno">14051</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14052"></a><span class="lineno">14052</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14053"></a><span class="lineno">14053</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14054"></a><span class="lineno">14054</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14055"></a><span class="lineno">14055</span>  allocation,</div>
+<div class="line"><a name="l14056"></a><span class="lineno">14056</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14057"></a><span class="lineno">14057</span>  Flush();</div>
+<div class="line"><a name="l14058"></a><span class="lineno">14058</span> }</div>
+<div class="line"><a name="l14059"></a><span class="lineno">14059</span>  </div>
+<div class="line"><a name="l14060"></a><span class="lineno">14060</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l14061"></a><span class="lineno">14061</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
+<div class="line"><a name="l14062"></a><span class="lineno">14062</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l14063"></a><span class="lineno">14063</span>  uint64_t allocationCount,</div>
+<div class="line"><a name="l14064"></a><span class="lineno">14064</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14065"></a><span class="lineno">14065</span> {</div>
+<div class="line"><a name="l14066"></a><span class="lineno">14066</span>  CallParams callParams;</div>
+<div class="line"><a name="l14067"></a><span class="lineno">14067</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14068"></a><span class="lineno">14068</span>  </div>
+<div class="line"><a name="l14069"></a><span class="lineno">14069</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14070"></a><span class="lineno">14070</span>  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="l14071"></a><span class="lineno">14071</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14072"></a><span class="lineno">14072</span>  vkMemReq.size,</div>
+<div class="line"><a name="l14073"></a><span class="lineno">14073</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l14074"></a><span class="lineno">14074</span>  vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l14075"></a><span class="lineno">14075</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14076"></a><span class="lineno">14076</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14077"></a><span class="lineno">14077</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14078"></a><span class="lineno">14078</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14079"></a><span class="lineno">14079</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14080"></a><span class="lineno">14080</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div>
+<div class="line"><a name="l14081"></a><span class="lineno">14081</span>  PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l14082"></a><span class="lineno">14082</span>  fprintf(m_File, <span class="stringliteral">",%s\n"</span>, userDataStr.GetString());</div>
+<div class="line"><a name="l14083"></a><span class="lineno">14083</span>  Flush();</div>
+<div class="line"><a name="l14084"></a><span class="lineno">14084</span> }</div>
+<div class="line"><a name="l14085"></a><span class="lineno">14085</span>  </div>
+<div class="line"><a name="l14086"></a><span class="lineno">14086</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l14087"></a><span class="lineno">14087</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
+<div class="line"><a name="l14088"></a><span class="lineno">14088</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l14089"></a><span class="lineno">14089</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l14090"></a><span class="lineno">14090</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l14091"></a><span class="lineno">14091</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14092"></a><span class="lineno">14092</span> {</div>
+<div class="line"><a name="l14093"></a><span class="lineno">14093</span>  CallParams callParams;</div>
+<div class="line"><a name="l14094"></a><span class="lineno">14094</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14095"></a><span class="lineno">14095</span>  </div>
+<div class="line"><a name="l14096"></a><span class="lineno">14096</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14097"></a><span class="lineno">14097</span>  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="l14098"></a><span class="lineno">14098</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14099"></a><span class="lineno">14099</span>  vkMemReq.size,</div>
+<div class="line"><a name="l14100"></a><span class="lineno">14100</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l14101"></a><span class="lineno">14101</span>  vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l14102"></a><span class="lineno">14102</span>  requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l14103"></a><span class="lineno">14103</span>  prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l14104"></a><span class="lineno">14104</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14105"></a><span class="lineno">14105</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14106"></a><span class="lineno">14106</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14107"></a><span class="lineno">14107</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14108"></a><span class="lineno">14108</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14109"></a><span class="lineno">14109</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14110"></a><span class="lineno">14110</span>  allocation,</div>
+<div class="line"><a name="l14111"></a><span class="lineno">14111</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14112"></a><span class="lineno">14112</span>  Flush();</div>
+<div class="line"><a name="l14113"></a><span class="lineno">14113</span> }</div>
+<div class="line"><a name="l14114"></a><span class="lineno">14114</span>  </div>
+<div class="line"><a name="l14115"></a><span class="lineno">14115</span> <span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l14116"></a><span class="lineno">14116</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
+<div class="line"><a name="l14117"></a><span class="lineno">14117</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l14118"></a><span class="lineno">14118</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l14119"></a><span class="lineno">14119</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l14120"></a><span class="lineno">14120</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14121"></a><span class="lineno">14121</span> {</div>
+<div class="line"><a name="l14122"></a><span class="lineno">14122</span>  CallParams callParams;</div>
+<div class="line"><a name="l14123"></a><span class="lineno">14123</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14124"></a><span class="lineno">14124</span>  </div>
+<div class="line"><a name="l14125"></a><span class="lineno">14125</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14126"></a><span class="lineno">14126</span>  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="l14127"></a><span class="lineno">14127</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14128"></a><span class="lineno">14128</span>  vkMemReq.size,</div>
+<div class="line"><a name="l14129"></a><span class="lineno">14129</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l14130"></a><span class="lineno">14130</span>  vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l14131"></a><span class="lineno">14131</span>  requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l14132"></a><span class="lineno">14132</span>  prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l14133"></a><span class="lineno">14133</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14134"></a><span class="lineno">14134</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14135"></a><span class="lineno">14135</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14136"></a><span class="lineno">14136</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14137"></a><span class="lineno">14137</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14138"></a><span class="lineno">14138</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14139"></a><span class="lineno">14139</span>  allocation,</div>
+<div class="line"><a name="l14140"></a><span class="lineno">14140</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14141"></a><span class="lineno">14141</span>  Flush();</div>
+<div class="line"><a name="l14142"></a><span class="lineno">14142</span> }</div>
<div class="line"><a name="l14143"></a><span class="lineno">14143</span>  </div>
-<div class="line"><a name="l14144"></a><span class="lineno">14144</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14145"></a><span class="lineno">14145</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFreeMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14146"></a><span class="lineno">14146</span>  allocation);</div>
-<div class="line"><a name="l14147"></a><span class="lineno">14147</span>  Flush();</div>
-<div class="line"><a name="l14148"></a><span class="lineno">14148</span> }</div>
+<div class="line"><a name="l14144"></a><span class="lineno">14144</span> <span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l14145"></a><span class="lineno">14145</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14146"></a><span class="lineno">14146</span> {</div>
+<div class="line"><a name="l14147"></a><span class="lineno">14147</span>  CallParams callParams;</div>
+<div class="line"><a name="l14148"></a><span class="lineno">14148</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14149"></a><span class="lineno">14149</span>  </div>
-<div class="line"><a name="l14150"></a><span class="lineno">14150</span> <span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l14151"></a><span class="lineno">14151</span>  uint64_t allocationCount,</div>
-<div class="line"><a name="l14152"></a><span class="lineno">14152</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l14153"></a><span class="lineno">14153</span> {</div>
-<div class="line"><a name="l14154"></a><span class="lineno">14154</span>  CallParams callParams;</div>
-<div class="line"><a name="l14155"></a><span class="lineno">14155</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14156"></a><span class="lineno">14156</span>  </div>
-<div class="line"><a name="l14157"></a><span class="lineno">14157</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14158"></a><span class="lineno">14158</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFreeMemoryPages,"</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l14159"></a><span class="lineno">14159</span>  PrintPointerList(allocationCount, pAllocations);</div>
-<div class="line"><a name="l14160"></a><span class="lineno">14160</span>  fprintf(m_File, <span class="stringliteral">"\n"</span>);</div>
-<div class="line"><a name="l14161"></a><span class="lineno">14161</span>  Flush();</div>
-<div class="line"><a name="l14162"></a><span class="lineno">14162</span> }</div>
-<div class="line"><a name="l14163"></a><span class="lineno">14163</span>  </div>
-<div class="line"><a name="l14164"></a><span class="lineno">14164</span> <span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div>
-<div class="line"><a name="l14165"></a><span class="lineno">14165</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l14166"></a><span class="lineno">14166</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l14167"></a><span class="lineno">14167</span> {</div>
-<div class="line"><a name="l14168"></a><span class="lineno">14168</span>  CallParams callParams;</div>
-<div class="line"><a name="l14169"></a><span class="lineno">14169</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14170"></a><span class="lineno">14170</span>  </div>
-<div class="line"><a name="l14171"></a><span class="lineno">14171</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14172"></a><span class="lineno">14172</span>  UserDataString userDataStr(</div>
-<div class="line"><a name="l14173"></a><span class="lineno">14173</span>  allocation->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="l14174"></a><span class="lineno">14174</span>  pUserData);</div>
-<div class="line"><a name="l14175"></a><span class="lineno">14175</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14176"></a><span class="lineno">14176</span>  allocation,</div>
-<div class="line"><a name="l14177"></a><span class="lineno">14177</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14178"></a><span class="lineno">14178</span>  Flush();</div>
-<div class="line"><a name="l14179"></a><span class="lineno">14179</span> }</div>
-<div class="line"><a name="l14180"></a><span class="lineno">14180</span>  </div>
-<div class="line"><a name="l14181"></a><span class="lineno">14181</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l14182"></a><span class="lineno">14182</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14183"></a><span class="lineno">14183</span> {</div>
-<div class="line"><a name="l14184"></a><span class="lineno">14184</span>  CallParams callParams;</div>
-<div class="line"><a name="l14185"></a><span class="lineno">14185</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14150"></a><span class="lineno">14150</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14151"></a><span class="lineno">14151</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFreeMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14152"></a><span class="lineno">14152</span>  allocation);</div>
+<div class="line"><a name="l14153"></a><span class="lineno">14153</span>  Flush();</div>
+<div class="line"><a name="l14154"></a><span class="lineno">14154</span> }</div>
+<div class="line"><a name="l14155"></a><span class="lineno">14155</span>  </div>
+<div class="line"><a name="l14156"></a><span class="lineno">14156</span> <span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l14157"></a><span class="lineno">14157</span>  uint64_t allocationCount,</div>
+<div class="line"><a name="l14158"></a><span class="lineno">14158</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14159"></a><span class="lineno">14159</span> {</div>
+<div class="line"><a name="l14160"></a><span class="lineno">14160</span>  CallParams callParams;</div>
+<div class="line"><a name="l14161"></a><span class="lineno">14161</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14162"></a><span class="lineno">14162</span>  </div>
+<div class="line"><a name="l14163"></a><span class="lineno">14163</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14164"></a><span class="lineno">14164</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFreeMemoryPages,"</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l14165"></a><span class="lineno">14165</span>  PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l14166"></a><span class="lineno">14166</span>  fprintf(m_File, <span class="stringliteral">"\n"</span>);</div>
+<div class="line"><a name="l14167"></a><span class="lineno">14167</span>  Flush();</div>
+<div class="line"><a name="l14168"></a><span class="lineno">14168</span> }</div>
+<div class="line"><a name="l14169"></a><span class="lineno">14169</span>  </div>
+<div class="line"><a name="l14170"></a><span class="lineno">14170</span> <span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div>
+<div class="line"><a name="l14171"></a><span class="lineno">14171</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l14172"></a><span class="lineno">14172</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l14173"></a><span class="lineno">14173</span> {</div>
+<div class="line"><a name="l14174"></a><span class="lineno">14174</span>  CallParams callParams;</div>
+<div class="line"><a name="l14175"></a><span class="lineno">14175</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14176"></a><span class="lineno">14176</span>  </div>
+<div class="line"><a name="l14177"></a><span class="lineno">14177</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14178"></a><span class="lineno">14178</span>  UserDataString userDataStr(</div>
+<div class="line"><a name="l14179"></a><span class="lineno">14179</span>  allocation->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="l14180"></a><span class="lineno">14180</span>  pUserData);</div>
+<div class="line"><a name="l14181"></a><span class="lineno">14181</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14182"></a><span class="lineno">14182</span>  allocation,</div>
+<div class="line"><a name="l14183"></a><span class="lineno">14183</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14184"></a><span class="lineno">14184</span>  Flush();</div>
+<div class="line"><a name="l14185"></a><span class="lineno">14185</span> }</div>
<div class="line"><a name="l14186"></a><span class="lineno">14186</span>  </div>
-<div class="line"><a name="l14187"></a><span class="lineno">14187</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14188"></a><span class="lineno">14188</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateLostAllocation,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14189"></a><span class="lineno">14189</span>  allocation);</div>
-<div class="line"><a name="l14190"></a><span class="lineno">14190</span>  Flush();</div>
-<div class="line"><a name="l14191"></a><span class="lineno">14191</span> }</div>
+<div class="line"><a name="l14187"></a><span class="lineno">14187</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14188"></a><span class="lineno">14188</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14189"></a><span class="lineno">14189</span> {</div>
+<div class="line"><a name="l14190"></a><span class="lineno">14190</span>  CallParams callParams;</div>
+<div class="line"><a name="l14191"></a><span class="lineno">14191</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14192"></a><span class="lineno">14192</span>  </div>
-<div class="line"><a name="l14193"></a><span class="lineno">14193</span> <span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l14194"></a><span class="lineno">14194</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14195"></a><span class="lineno">14195</span> {</div>
-<div class="line"><a name="l14196"></a><span class="lineno">14196</span>  CallParams callParams;</div>
-<div class="line"><a name="l14197"></a><span class="lineno">14197</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14193"></a><span class="lineno">14193</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14194"></a><span class="lineno">14194</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateLostAllocation,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14195"></a><span class="lineno">14195</span>  allocation);</div>
+<div class="line"><a name="l14196"></a><span class="lineno">14196</span>  Flush();</div>
+<div class="line"><a name="l14197"></a><span class="lineno">14197</span> }</div>
<div class="line"><a name="l14198"></a><span class="lineno">14198</span>  </div>
-<div class="line"><a name="l14199"></a><span class="lineno">14199</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14200"></a><span class="lineno">14200</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaMapMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14201"></a><span class="lineno">14201</span>  allocation);</div>
-<div class="line"><a name="l14202"></a><span class="lineno">14202</span>  Flush();</div>
-<div class="line"><a name="l14203"></a><span class="lineno">14203</span> }</div>
+<div class="line"><a name="l14199"></a><span class="lineno">14199</span> <span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l14200"></a><span class="lineno">14200</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14201"></a><span class="lineno">14201</span> {</div>
+<div class="line"><a name="l14202"></a><span class="lineno">14202</span>  CallParams callParams;</div>
+<div class="line"><a name="l14203"></a><span class="lineno">14203</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14204"></a><span class="lineno">14204</span>  </div>
-<div class="line"><a name="l14205"></a><span class="lineno">14205</span> <span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l14206"></a><span class="lineno">14206</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14207"></a><span class="lineno">14207</span> {</div>
-<div class="line"><a name="l14208"></a><span class="lineno">14208</span>  CallParams callParams;</div>
-<div class="line"><a name="l14209"></a><span class="lineno">14209</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14205"></a><span class="lineno">14205</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14206"></a><span class="lineno">14206</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaMapMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14207"></a><span class="lineno">14207</span>  allocation);</div>
+<div class="line"><a name="l14208"></a><span class="lineno">14208</span>  Flush();</div>
+<div class="line"><a name="l14209"></a><span class="lineno">14209</span> }</div>
<div class="line"><a name="l14210"></a><span class="lineno">14210</span>  </div>
-<div class="line"><a name="l14211"></a><span class="lineno">14211</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14212"></a><span class="lineno">14212</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaUnmapMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14213"></a><span class="lineno">14213</span>  allocation);</div>
-<div class="line"><a name="l14214"></a><span class="lineno">14214</span>  Flush();</div>
-<div class="line"><a name="l14215"></a><span class="lineno">14215</span> }</div>
+<div class="line"><a name="l14211"></a><span class="lineno">14211</span> <span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l14212"></a><span class="lineno">14212</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14213"></a><span class="lineno">14213</span> {</div>
+<div class="line"><a name="l14214"></a><span class="lineno">14214</span>  CallParams callParams;</div>
+<div class="line"><a name="l14215"></a><span class="lineno">14215</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14216"></a><span class="lineno">14216</span>  </div>
-<div class="line"><a name="l14217"></a><span class="lineno">14217</span> <span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l14218"></a><span class="lineno">14218</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l14219"></a><span class="lineno">14219</span> {</div>
-<div class="line"><a name="l14220"></a><span class="lineno">14220</span>  CallParams callParams;</div>
-<div class="line"><a name="l14221"></a><span class="lineno">14221</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14217"></a><span class="lineno">14217</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14218"></a><span class="lineno">14218</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaUnmapMemory,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14219"></a><span class="lineno">14219</span>  allocation);</div>
+<div class="line"><a name="l14220"></a><span class="lineno">14220</span>  Flush();</div>
+<div class="line"><a name="l14221"></a><span class="lineno">14221</span> }</div>
<div class="line"><a name="l14222"></a><span class="lineno">14222</span>  </div>
-<div class="line"><a name="l14223"></a><span class="lineno">14223</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14224"></a><span class="lineno">14224</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14225"></a><span class="lineno">14225</span>  allocation,</div>
-<div class="line"><a name="l14226"></a><span class="lineno">14226</span>  offset,</div>
-<div class="line"><a name="l14227"></a><span class="lineno">14227</span>  size);</div>
-<div class="line"><a name="l14228"></a><span class="lineno">14228</span>  Flush();</div>
-<div class="line"><a name="l14229"></a><span class="lineno">14229</span> }</div>
-<div class="line"><a name="l14230"></a><span class="lineno">14230</span>  </div>
-<div class="line"><a name="l14231"></a><span class="lineno">14231</span> <span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l14232"></a><span class="lineno">14232</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l14233"></a><span class="lineno">14233</span> {</div>
-<div class="line"><a name="l14234"></a><span class="lineno">14234</span>  CallParams callParams;</div>
-<div class="line"><a name="l14235"></a><span class="lineno">14235</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14223"></a><span class="lineno">14223</span> <span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14224"></a><span class="lineno">14224</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l14225"></a><span class="lineno">14225</span> {</div>
+<div class="line"><a name="l14226"></a><span class="lineno">14226</span>  CallParams callParams;</div>
+<div class="line"><a name="l14227"></a><span class="lineno">14227</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14228"></a><span class="lineno">14228</span>  </div>
+<div class="line"><a name="l14229"></a><span class="lineno">14229</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14230"></a><span class="lineno">14230</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14231"></a><span class="lineno">14231</span>  allocation,</div>
+<div class="line"><a name="l14232"></a><span class="lineno">14232</span>  offset,</div>
+<div class="line"><a name="l14233"></a><span class="lineno">14233</span>  size);</div>
+<div class="line"><a name="l14234"></a><span class="lineno">14234</span>  Flush();</div>
+<div class="line"><a name="l14235"></a><span class="lineno">14235</span> }</div>
<div class="line"><a name="l14236"></a><span class="lineno">14236</span>  </div>
-<div class="line"><a name="l14237"></a><span class="lineno">14237</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14238"></a><span class="lineno">14238</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14239"></a><span class="lineno">14239</span>  allocation,</div>
-<div class="line"><a name="l14240"></a><span class="lineno">14240</span>  offset,</div>
-<div class="line"><a name="l14241"></a><span class="lineno">14241</span>  size);</div>
-<div class="line"><a name="l14242"></a><span class="lineno">14242</span>  Flush();</div>
-<div class="line"><a name="l14243"></a><span class="lineno">14243</span> }</div>
-<div class="line"><a name="l14244"></a><span class="lineno">14244</span>  </div>
-<div class="line"><a name="l14245"></a><span class="lineno">14245</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l14246"></a><span class="lineno">14246</span>  <span class="keyword">const</span> VkBufferCreateInfo& bufCreateInfo,</div>
-<div class="line"><a name="l14247"></a><span class="lineno">14247</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& allocCreateInfo,</div>
-<div class="line"><a name="l14248"></a><span class="lineno">14248</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14249"></a><span class="lineno">14249</span> {</div>
-<div class="line"><a name="l14250"></a><span class="lineno">14250</span>  CallParams callParams;</div>
-<div class="line"><a name="l14251"></a><span class="lineno">14251</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14252"></a><span class="lineno">14252</span>  </div>
-<div class="line"><a name="l14253"></a><span class="lineno">14253</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14254"></a><span class="lineno">14254</span>  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="l14255"></a><span class="lineno">14255</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14256"></a><span class="lineno">14256</span>  bufCreateInfo.flags,</div>
-<div class="line"><a name="l14257"></a><span class="lineno">14257</span>  bufCreateInfo.size,</div>
-<div class="line"><a name="l14258"></a><span class="lineno">14258</span>  bufCreateInfo.usage,</div>
-<div class="line"><a name="l14259"></a><span class="lineno">14259</span>  bufCreateInfo.sharingMode,</div>
-<div class="line"><a name="l14260"></a><span class="lineno">14260</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14261"></a><span class="lineno">14261</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14262"></a><span class="lineno">14262</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14263"></a><span class="lineno">14263</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14264"></a><span class="lineno">14264</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14265"></a><span class="lineno">14265</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14266"></a><span class="lineno">14266</span>  allocation,</div>
-<div class="line"><a name="l14267"></a><span class="lineno">14267</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14268"></a><span class="lineno">14268</span>  Flush();</div>
-<div class="line"><a name="l14269"></a><span class="lineno">14269</span> }</div>
-<div class="line"><a name="l14270"></a><span class="lineno">14270</span>  </div>
-<div class="line"><a name="l14271"></a><span class="lineno">14271</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l14272"></a><span class="lineno">14272</span>  <span class="keyword">const</span> VkImageCreateInfo& imageCreateInfo,</div>
-<div class="line"><a name="l14273"></a><span class="lineno">14273</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& allocCreateInfo,</div>
-<div class="line"><a name="l14274"></a><span class="lineno">14274</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14275"></a><span class="lineno">14275</span> {</div>
-<div class="line"><a name="l14276"></a><span class="lineno">14276</span>  CallParams callParams;</div>
-<div class="line"><a name="l14277"></a><span class="lineno">14277</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14278"></a><span class="lineno">14278</span>  </div>
-<div class="line"><a name="l14279"></a><span class="lineno">14279</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14280"></a><span class="lineno">14280</span>  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="l14281"></a><span class="lineno">14281</span>  fprintf(m_File, <span class="stringliteral">"%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"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14282"></a><span class="lineno">14282</span>  imageCreateInfo.flags,</div>
-<div class="line"><a name="l14283"></a><span class="lineno">14283</span>  imageCreateInfo.imageType,</div>
-<div class="line"><a name="l14284"></a><span class="lineno">14284</span>  imageCreateInfo.format,</div>
-<div class="line"><a name="l14285"></a><span class="lineno">14285</span>  imageCreateInfo.extent.width,</div>
-<div class="line"><a name="l14286"></a><span class="lineno">14286</span>  imageCreateInfo.extent.height,</div>
-<div class="line"><a name="l14287"></a><span class="lineno">14287</span>  imageCreateInfo.extent.depth,</div>
-<div class="line"><a name="l14288"></a><span class="lineno">14288</span>  imageCreateInfo.mipLevels,</div>
-<div class="line"><a name="l14289"></a><span class="lineno">14289</span>  imageCreateInfo.arrayLayers,</div>
-<div class="line"><a name="l14290"></a><span class="lineno">14290</span>  imageCreateInfo.samples,</div>
-<div class="line"><a name="l14291"></a><span class="lineno">14291</span>  imageCreateInfo.tiling,</div>
-<div class="line"><a name="l14292"></a><span class="lineno">14292</span>  imageCreateInfo.usage,</div>
-<div class="line"><a name="l14293"></a><span class="lineno">14293</span>  imageCreateInfo.sharingMode,</div>
-<div class="line"><a name="l14294"></a><span class="lineno">14294</span>  imageCreateInfo.initialLayout,</div>
-<div class="line"><a name="l14295"></a><span class="lineno">14295</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14296"></a><span class="lineno">14296</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14297"></a><span class="lineno">14297</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14298"></a><span class="lineno">14298</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14299"></a><span class="lineno">14299</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14300"></a><span class="lineno">14300</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14301"></a><span class="lineno">14301</span>  allocation,</div>
-<div class="line"><a name="l14302"></a><span class="lineno">14302</span>  userDataStr.GetString());</div>
-<div class="line"><a name="l14303"></a><span class="lineno">14303</span>  Flush();</div>
-<div class="line"><a name="l14304"></a><span class="lineno">14304</span> }</div>
-<div class="line"><a name="l14305"></a><span class="lineno">14305</span>  </div>
-<div class="line"><a name="l14306"></a><span class="lineno">14306</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l14307"></a><span class="lineno">14307</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14308"></a><span class="lineno">14308</span> {</div>
-<div class="line"><a name="l14309"></a><span class="lineno">14309</span>  CallParams callParams;</div>
-<div class="line"><a name="l14310"></a><span class="lineno">14310</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14237"></a><span class="lineno">14237</span> <span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14238"></a><span class="lineno">14238</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l14239"></a><span class="lineno">14239</span> {</div>
+<div class="line"><a name="l14240"></a><span class="lineno">14240</span>  CallParams callParams;</div>
+<div class="line"><a name="l14241"></a><span class="lineno">14241</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14242"></a><span class="lineno">14242</span>  </div>
+<div class="line"><a name="l14243"></a><span class="lineno">14243</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14244"></a><span class="lineno">14244</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14245"></a><span class="lineno">14245</span>  allocation,</div>
+<div class="line"><a name="l14246"></a><span class="lineno">14246</span>  offset,</div>
+<div class="line"><a name="l14247"></a><span class="lineno">14247</span>  size);</div>
+<div class="line"><a name="l14248"></a><span class="lineno">14248</span>  Flush();</div>
+<div class="line"><a name="l14249"></a><span class="lineno">14249</span> }</div>
+<div class="line"><a name="l14250"></a><span class="lineno">14250</span>  </div>
+<div class="line"><a name="l14251"></a><span class="lineno">14251</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l14252"></a><span class="lineno">14252</span>  <span class="keyword">const</span> VkBufferCreateInfo& bufCreateInfo,</div>
+<div class="line"><a name="l14253"></a><span class="lineno">14253</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& allocCreateInfo,</div>
+<div class="line"><a name="l14254"></a><span class="lineno">14254</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14255"></a><span class="lineno">14255</span> {</div>
+<div class="line"><a name="l14256"></a><span class="lineno">14256</span>  CallParams callParams;</div>
+<div class="line"><a name="l14257"></a><span class="lineno">14257</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14258"></a><span class="lineno">14258</span>  </div>
+<div class="line"><a name="l14259"></a><span class="lineno">14259</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14260"></a><span class="lineno">14260</span>  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="l14261"></a><span class="lineno">14261</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14262"></a><span class="lineno">14262</span>  bufCreateInfo.flags,</div>
+<div class="line"><a name="l14263"></a><span class="lineno">14263</span>  bufCreateInfo.size,</div>
+<div class="line"><a name="l14264"></a><span class="lineno">14264</span>  bufCreateInfo.usage,</div>
+<div class="line"><a name="l14265"></a><span class="lineno">14265</span>  bufCreateInfo.sharingMode,</div>
+<div class="line"><a name="l14266"></a><span class="lineno">14266</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14267"></a><span class="lineno">14267</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14268"></a><span class="lineno">14268</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14269"></a><span class="lineno">14269</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14270"></a><span class="lineno">14270</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14271"></a><span class="lineno">14271</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14272"></a><span class="lineno">14272</span>  allocation,</div>
+<div class="line"><a name="l14273"></a><span class="lineno">14273</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14274"></a><span class="lineno">14274</span>  Flush();</div>
+<div class="line"><a name="l14275"></a><span class="lineno">14275</span> }</div>
+<div class="line"><a name="l14276"></a><span class="lineno">14276</span>  </div>
+<div class="line"><a name="l14277"></a><span class="lineno">14277</span> <span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l14278"></a><span class="lineno">14278</span>  <span class="keyword">const</span> VkImageCreateInfo& imageCreateInfo,</div>
+<div class="line"><a name="l14279"></a><span class="lineno">14279</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& allocCreateInfo,</div>
+<div class="line"><a name="l14280"></a><span class="lineno">14280</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14281"></a><span class="lineno">14281</span> {</div>
+<div class="line"><a name="l14282"></a><span class="lineno">14282</span>  CallParams callParams;</div>
+<div class="line"><a name="l14283"></a><span class="lineno">14283</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14284"></a><span class="lineno">14284</span>  </div>
+<div class="line"><a name="l14285"></a><span class="lineno">14285</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14286"></a><span class="lineno">14286</span>  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="l14287"></a><span class="lineno">14287</span>  fprintf(m_File, <span class="stringliteral">"%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"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14288"></a><span class="lineno">14288</span>  imageCreateInfo.flags,</div>
+<div class="line"><a name="l14289"></a><span class="lineno">14289</span>  imageCreateInfo.imageType,</div>
+<div class="line"><a name="l14290"></a><span class="lineno">14290</span>  imageCreateInfo.format,</div>
+<div class="line"><a name="l14291"></a><span class="lineno">14291</span>  imageCreateInfo.extent.width,</div>
+<div class="line"><a name="l14292"></a><span class="lineno">14292</span>  imageCreateInfo.extent.height,</div>
+<div class="line"><a name="l14293"></a><span class="lineno">14293</span>  imageCreateInfo.extent.depth,</div>
+<div class="line"><a name="l14294"></a><span class="lineno">14294</span>  imageCreateInfo.mipLevels,</div>
+<div class="line"><a name="l14295"></a><span class="lineno">14295</span>  imageCreateInfo.arrayLayers,</div>
+<div class="line"><a name="l14296"></a><span class="lineno">14296</span>  imageCreateInfo.samples,</div>
+<div class="line"><a name="l14297"></a><span class="lineno">14297</span>  imageCreateInfo.tiling,</div>
+<div class="line"><a name="l14298"></a><span class="lineno">14298</span>  imageCreateInfo.usage,</div>
+<div class="line"><a name="l14299"></a><span class="lineno">14299</span>  imageCreateInfo.sharingMode,</div>
+<div class="line"><a name="l14300"></a><span class="lineno">14300</span>  imageCreateInfo.initialLayout,</div>
+<div class="line"><a name="l14301"></a><span class="lineno">14301</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l14302"></a><span class="lineno">14302</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l14303"></a><span class="lineno">14303</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l14304"></a><span class="lineno">14304</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l14305"></a><span class="lineno">14305</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l14306"></a><span class="lineno">14306</span>  allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l14307"></a><span class="lineno">14307</span>  allocation,</div>
+<div class="line"><a name="l14308"></a><span class="lineno">14308</span>  userDataStr.GetString());</div>
+<div class="line"><a name="l14309"></a><span class="lineno">14309</span>  Flush();</div>
+<div class="line"><a name="l14310"></a><span class="lineno">14310</span> }</div>
<div class="line"><a name="l14311"></a><span class="lineno">14311</span>  </div>
-<div class="line"><a name="l14312"></a><span class="lineno">14312</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14313"></a><span class="lineno">14313</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyBuffer,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14314"></a><span class="lineno">14314</span>  allocation);</div>
-<div class="line"><a name="l14315"></a><span class="lineno">14315</span>  Flush();</div>
-<div class="line"><a name="l14316"></a><span class="lineno">14316</span> }</div>
+<div class="line"><a name="l14312"></a><span class="lineno">14312</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l14313"></a><span class="lineno">14313</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14314"></a><span class="lineno">14314</span> {</div>
+<div class="line"><a name="l14315"></a><span class="lineno">14315</span>  CallParams callParams;</div>
+<div class="line"><a name="l14316"></a><span class="lineno">14316</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14317"></a><span class="lineno">14317</span>  </div>
-<div class="line"><a name="l14318"></a><span class="lineno">14318</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l14319"></a><span class="lineno">14319</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14320"></a><span class="lineno">14320</span> {</div>
-<div class="line"><a name="l14321"></a><span class="lineno">14321</span>  CallParams callParams;</div>
-<div class="line"><a name="l14322"></a><span class="lineno">14322</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14318"></a><span class="lineno">14318</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14319"></a><span class="lineno">14319</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyBuffer,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14320"></a><span class="lineno">14320</span>  allocation);</div>
+<div class="line"><a name="l14321"></a><span class="lineno">14321</span>  Flush();</div>
+<div class="line"><a name="l14322"></a><span class="lineno">14322</span> }</div>
<div class="line"><a name="l14323"></a><span class="lineno">14323</span>  </div>
-<div class="line"><a name="l14324"></a><span class="lineno">14324</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14325"></a><span class="lineno">14325</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyImage,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14326"></a><span class="lineno">14326</span>  allocation);</div>
-<div class="line"><a name="l14327"></a><span class="lineno">14327</span>  Flush();</div>
-<div class="line"><a name="l14328"></a><span class="lineno">14328</span> }</div>
+<div class="line"><a name="l14324"></a><span class="lineno">14324</span> <span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l14325"></a><span class="lineno">14325</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14326"></a><span class="lineno">14326</span> {</div>
+<div class="line"><a name="l14327"></a><span class="lineno">14327</span>  CallParams callParams;</div>
+<div class="line"><a name="l14328"></a><span class="lineno">14328</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14329"></a><span class="lineno">14329</span>  </div>
-<div class="line"><a name="l14330"></a><span class="lineno">14330</span> <span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l14331"></a><span class="lineno">14331</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14332"></a><span class="lineno">14332</span> {</div>
-<div class="line"><a name="l14333"></a><span class="lineno">14333</span>  CallParams callParams;</div>
-<div class="line"><a name="l14334"></a><span class="lineno">14334</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14330"></a><span class="lineno">14330</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14331"></a><span class="lineno">14331</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDestroyImage,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14332"></a><span class="lineno">14332</span>  allocation);</div>
+<div class="line"><a name="l14333"></a><span class="lineno">14333</span>  Flush();</div>
+<div class="line"><a name="l14334"></a><span class="lineno">14334</span> }</div>
<div class="line"><a name="l14335"></a><span class="lineno">14335</span>  </div>
-<div class="line"><a name="l14336"></a><span class="lineno">14336</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14337"></a><span class="lineno">14337</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaTouchAllocation,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14338"></a><span class="lineno">14338</span>  allocation);</div>
-<div class="line"><a name="l14339"></a><span class="lineno">14339</span>  Flush();</div>
-<div class="line"><a name="l14340"></a><span class="lineno">14340</span> }</div>
+<div class="line"><a name="l14336"></a><span class="lineno">14336</span> <span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l14337"></a><span class="lineno">14337</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14338"></a><span class="lineno">14338</span> {</div>
+<div class="line"><a name="l14339"></a><span class="lineno">14339</span>  CallParams callParams;</div>
+<div class="line"><a name="l14340"></a><span class="lineno">14340</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14341"></a><span class="lineno">14341</span>  </div>
-<div class="line"><a name="l14342"></a><span class="lineno">14342</span> <span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div>
-<div class="line"><a name="l14343"></a><span class="lineno">14343</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14344"></a><span class="lineno">14344</span> {</div>
-<div class="line"><a name="l14345"></a><span class="lineno">14345</span>  CallParams callParams;</div>
-<div class="line"><a name="l14346"></a><span class="lineno">14346</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14342"></a><span class="lineno">14342</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14343"></a><span class="lineno">14343</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaTouchAllocation,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14344"></a><span class="lineno">14344</span>  allocation);</div>
+<div class="line"><a name="l14345"></a><span class="lineno">14345</span>  Flush();</div>
+<div class="line"><a name="l14346"></a><span class="lineno">14346</span> }</div>
<div class="line"><a name="l14347"></a><span class="lineno">14347</span>  </div>
-<div class="line"><a name="l14348"></a><span class="lineno">14348</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14349"></a><span class="lineno">14349</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaGetAllocationInfo,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14350"></a><span class="lineno">14350</span>  allocation);</div>
-<div class="line"><a name="l14351"></a><span class="lineno">14351</span>  Flush();</div>
-<div class="line"><a name="l14352"></a><span class="lineno">14352</span> }</div>
+<div class="line"><a name="l14348"></a><span class="lineno">14348</span> <span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div>
+<div class="line"><a name="l14349"></a><span class="lineno">14349</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l14350"></a><span class="lineno">14350</span> {</div>
+<div class="line"><a name="l14351"></a><span class="lineno">14351</span>  CallParams callParams;</div>
+<div class="line"><a name="l14352"></a><span class="lineno">14352</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14353"></a><span class="lineno">14353</span>  </div>
-<div class="line"><a name="l14354"></a><span class="lineno">14354</span> <span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
-<div class="line"><a name="l14355"></a><span class="lineno">14355</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l14356"></a><span class="lineno">14356</span> {</div>
-<div class="line"><a name="l14357"></a><span class="lineno">14357</span>  CallParams callParams;</div>
-<div class="line"><a name="l14358"></a><span class="lineno">14358</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14354"></a><span class="lineno">14354</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14355"></a><span class="lineno">14355</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaGetAllocationInfo,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14356"></a><span class="lineno">14356</span>  allocation);</div>
+<div class="line"><a name="l14357"></a><span class="lineno">14357</span>  Flush();</div>
+<div class="line"><a name="l14358"></a><span class="lineno">14358</span> }</div>
<div class="line"><a name="l14359"></a><span class="lineno">14359</span>  </div>
-<div class="line"><a name="l14360"></a><span class="lineno">14360</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14361"></a><span class="lineno">14361</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14362"></a><span class="lineno">14362</span>  pool);</div>
-<div class="line"><a name="l14363"></a><span class="lineno">14363</span>  Flush();</div>
-<div class="line"><a name="l14364"></a><span class="lineno">14364</span> }</div>
+<div class="line"><a name="l14360"></a><span class="lineno">14360</span> <span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
+<div class="line"><a name="l14361"></a><span class="lineno">14361</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l14362"></a><span class="lineno">14362</span> {</div>
+<div class="line"><a name="l14363"></a><span class="lineno">14363</span>  CallParams callParams;</div>
+<div class="line"><a name="l14364"></a><span class="lineno">14364</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14365"></a><span class="lineno">14365</span>  </div>
-<div class="line"><a name="l14366"></a><span class="lineno">14366</span> <span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div>
-<div class="line"><a name="l14367"></a><span class="lineno">14367</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div>
-<div class="line"><a name="l14368"></a><span class="lineno">14368</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
-<div class="line"><a name="l14369"></a><span class="lineno">14369</span> {</div>
-<div class="line"><a name="l14370"></a><span class="lineno">14370</span>  CallParams callParams;</div>
-<div class="line"><a name="l14371"></a><span class="lineno">14371</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14372"></a><span class="lineno">14372</span>  </div>
-<div class="line"><a name="l14373"></a><span class="lineno">14373</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14374"></a><span class="lineno">14374</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDefragmentationBegin,%u,"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14375"></a><span class="lineno">14375</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
-<div class="line"><a name="l14376"></a><span class="lineno">14376</span>  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="l14377"></a><span class="lineno">14377</span>  fprintf(m_File, <span class="stringliteral">","</span>);</div>
-<div class="line"><a name="l14378"></a><span class="lineno">14378</span>  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="l14379"></a><span class="lineno">14379</span>  fprintf(m_File, <span class="stringliteral">",%llu,%u,%llu,%u,%p,%p\n"</span>,</div>
-<div class="line"><a name="l14380"></a><span class="lineno">14380</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div>
-<div class="line"><a name="l14381"></a><span class="lineno">14381</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l14382"></a><span class="lineno">14382</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div>
-<div class="line"><a name="l14383"></a><span class="lineno">14383</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l14384"></a><span class="lineno">14384</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div>
-<div class="line"><a name="l14385"></a><span class="lineno">14385</span>  ctx);</div>
-<div class="line"><a name="l14386"></a><span class="lineno">14386</span>  Flush();</div>
-<div class="line"><a name="l14387"></a><span class="lineno">14387</span> }</div>
-<div class="line"><a name="l14388"></a><span class="lineno">14388</span>  </div>
-<div class="line"><a name="l14389"></a><span class="lineno">14389</span> <span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div>
-<div class="line"><a name="l14390"></a><span class="lineno">14390</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
-<div class="line"><a name="l14391"></a><span class="lineno">14391</span> {</div>
-<div class="line"><a name="l14392"></a><span class="lineno">14392</span>  CallParams callParams;</div>
-<div class="line"><a name="l14393"></a><span class="lineno">14393</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14366"></a><span class="lineno">14366</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14367"></a><span class="lineno">14367</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14368"></a><span class="lineno">14368</span>  pool);</div>
+<div class="line"><a name="l14369"></a><span class="lineno">14369</span>  Flush();</div>
+<div class="line"><a name="l14370"></a><span class="lineno">14370</span> }</div>
+<div class="line"><a name="l14371"></a><span class="lineno">14371</span>  </div>
+<div class="line"><a name="l14372"></a><span class="lineno">14372</span> <span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div>
+<div class="line"><a name="l14373"></a><span class="lineno">14373</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div>
+<div class="line"><a name="l14374"></a><span class="lineno">14374</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
+<div class="line"><a name="l14375"></a><span class="lineno">14375</span> {</div>
+<div class="line"><a name="l14376"></a><span class="lineno">14376</span>  CallParams callParams;</div>
+<div class="line"><a name="l14377"></a><span class="lineno">14377</span>  GetBasicParams(callParams);</div>
+<div class="line"><a name="l14378"></a><span class="lineno">14378</span>  </div>
+<div class="line"><a name="l14379"></a><span class="lineno">14379</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14380"></a><span class="lineno">14380</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDefragmentationBegin,%u,"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14381"></a><span class="lineno">14381</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
+<div class="line"><a name="l14382"></a><span class="lineno">14382</span>  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="l14383"></a><span class="lineno">14383</span>  fprintf(m_File, <span class="stringliteral">","</span>);</div>
+<div class="line"><a name="l14384"></a><span class="lineno">14384</span>  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="l14385"></a><span class="lineno">14385</span>  fprintf(m_File, <span class="stringliteral">",%llu,%u,%llu,%u,%p,%p\n"</span>,</div>
+<div class="line"><a name="l14386"></a><span class="lineno">14386</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div>
+<div class="line"><a name="l14387"></a><span class="lineno">14387</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l14388"></a><span class="lineno">14388</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div>
+<div class="line"><a name="l14389"></a><span class="lineno">14389</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l14390"></a><span class="lineno">14390</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div>
+<div class="line"><a name="l14391"></a><span class="lineno">14391</span>  ctx);</div>
+<div class="line"><a name="l14392"></a><span class="lineno">14392</span>  Flush();</div>
+<div class="line"><a name="l14393"></a><span class="lineno">14393</span> }</div>
<div class="line"><a name="l14394"></a><span class="lineno">14394</span>  </div>
-<div class="line"><a name="l14395"></a><span class="lineno">14395</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14396"></a><span class="lineno">14396</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDefragmentationEnd,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14397"></a><span class="lineno">14397</span>  ctx);</div>
-<div class="line"><a name="l14398"></a><span class="lineno">14398</span>  Flush();</div>
-<div class="line"><a name="l14399"></a><span class="lineno">14399</span> }</div>
+<div class="line"><a name="l14395"></a><span class="lineno">14395</span> <span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div>
+<div class="line"><a name="l14396"></a><span class="lineno">14396</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
+<div class="line"><a name="l14397"></a><span class="lineno">14397</span> {</div>
+<div class="line"><a name="l14398"></a><span class="lineno">14398</span>  CallParams callParams;</div>
+<div class="line"><a name="l14399"></a><span class="lineno">14399</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14400"></a><span class="lineno">14400</span>  </div>
-<div class="line"><a name="l14401"></a><span class="lineno">14401</span> <span class="keywordtype">void</span> VmaRecorder::RecordSetPoolName(uint32_t frameIndex,</div>
-<div class="line"><a name="l14402"></a><span class="lineno">14402</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l14403"></a><span class="lineno">14403</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* name)</div>
-<div class="line"><a name="l14404"></a><span class="lineno">14404</span> {</div>
-<div class="line"><a name="l14405"></a><span class="lineno">14405</span>  CallParams callParams;</div>
-<div class="line"><a name="l14406"></a><span class="lineno">14406</span>  GetBasicParams(callParams);</div>
-<div class="line"><a name="l14407"></a><span class="lineno">14407</span>  </div>
-<div class="line"><a name="l14408"></a><span class="lineno">14408</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14409"></a><span class="lineno">14409</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaSetPoolName,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14410"></a><span class="lineno">14410</span>  pool, name != VMA_NULL ? name : <span class="stringliteral">""</span>);</div>
-<div class="line"><a name="l14411"></a><span class="lineno">14411</span>  Flush();</div>
-<div class="line"><a name="l14412"></a><span class="lineno">14412</span> }</div>
+<div class="line"><a name="l14401"></a><span class="lineno">14401</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14402"></a><span class="lineno">14402</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaDefragmentationEnd,%p\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14403"></a><span class="lineno">14403</span>  ctx);</div>
+<div class="line"><a name="l14404"></a><span class="lineno">14404</span>  Flush();</div>
+<div class="line"><a name="l14405"></a><span class="lineno">14405</span> }</div>
+<div class="line"><a name="l14406"></a><span class="lineno">14406</span>  </div>
+<div class="line"><a name="l14407"></a><span class="lineno">14407</span> <span class="keywordtype">void</span> VmaRecorder::RecordSetPoolName(uint32_t frameIndex,</div>
+<div class="line"><a name="l14408"></a><span class="lineno">14408</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l14409"></a><span class="lineno">14409</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* name)</div>
+<div class="line"><a name="l14410"></a><span class="lineno">14410</span> {</div>
+<div class="line"><a name="l14411"></a><span class="lineno">14411</span>  CallParams callParams;</div>
+<div class="line"><a name="l14412"></a><span class="lineno">14412</span>  GetBasicParams(callParams);</div>
<div class="line"><a name="l14413"></a><span class="lineno">14413</span>  </div>
-<div class="line"><a name="l14414"></a><span class="lineno">14414</span> 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="l14415"></a><span class="lineno">14415</span> {</div>
-<div class="line"><a name="l14416"></a><span class="lineno">14416</span>  <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
-<div class="line"><a name="l14417"></a><span class="lineno">14417</span>  {</div>
-<div class="line"><a name="l14418"></a><span class="lineno">14418</span>  <span class="keywordflow">if</span>((allocFlags & <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="l14419"></a><span class="lineno">14419</span>  {</div>
-<div class="line"><a name="l14420"></a><span class="lineno">14420</span>  m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div>
-<div class="line"><a name="l14421"></a><span class="lineno">14421</span>  }</div>
-<div class="line"><a name="l14422"></a><span class="lineno">14422</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14423"></a><span class="lineno">14423</span>  {</div>
-<div class="line"><a name="l14424"></a><span class="lineno">14424</span>  sprintf_s(m_PtrStr, <span class="stringliteral">"%p"</span>, pUserData);</div>
-<div class="line"><a name="l14425"></a><span class="lineno">14425</span>  m_Str = m_PtrStr;</div>
-<div class="line"><a name="l14426"></a><span class="lineno">14426</span>  }</div>
-<div class="line"><a name="l14427"></a><span class="lineno">14427</span>  }</div>
-<div class="line"><a name="l14428"></a><span class="lineno">14428</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14429"></a><span class="lineno">14429</span>  {</div>
-<div class="line"><a name="l14430"></a><span class="lineno">14430</span>  m_Str = <span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l14431"></a><span class="lineno">14431</span>  }</div>
-<div class="line"><a name="l14432"></a><span class="lineno">14432</span> }</div>
-<div class="line"><a name="l14433"></a><span class="lineno">14433</span>  </div>
-<div class="line"><a name="l14434"></a><span class="lineno">14434</span> <span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div>
-<div class="line"><a name="l14435"></a><span class="lineno">14435</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties& devProps,</div>
-<div class="line"><a name="l14436"></a><span class="lineno">14436</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties& memProps,</div>
-<div class="line"><a name="l14437"></a><span class="lineno">14437</span>  uint32_t vulkanApiVersion,</div>
-<div class="line"><a name="l14438"></a><span class="lineno">14438</span>  <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
-<div class="line"><a name="l14439"></a><span class="lineno">14439</span>  <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
-<div class="line"><a name="l14440"></a><span class="lineno">14440</span>  <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled)</div>
-<div class="line"><a name="l14441"></a><span class="lineno">14441</span> {</div>
-<div class="line"><a name="l14442"></a><span class="lineno">14442</span>  fprintf(m_File, <span class="stringliteral">"Config,Begin\n"</span>);</div>
-<div class="line"><a name="l14443"></a><span class="lineno">14443</span>  </div>
-<div class="line"><a name="l14444"></a><span class="lineno">14444</span>  fprintf(m_File, <span class="stringliteral">"VulkanApiVersion,%u,%u\n"</span>, VK_VERSION_MAJOR(vulkanApiVersion), VK_VERSION_MINOR(vulkanApiVersion));</div>
-<div class="line"><a name="l14445"></a><span class="lineno">14445</span>  </div>
-<div class="line"><a name="l14446"></a><span class="lineno">14446</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,apiVersion,%u\n"</span>, devProps.apiVersion);</div>
-<div class="line"><a name="l14447"></a><span class="lineno">14447</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,driverVersion,%u\n"</span>, devProps.driverVersion);</div>
-<div class="line"><a name="l14448"></a><span class="lineno">14448</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,vendorID,%u\n"</span>, devProps.vendorID);</div>
-<div class="line"><a name="l14449"></a><span class="lineno">14449</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceID,%u\n"</span>, devProps.deviceID);</div>
-<div class="line"><a name="l14450"></a><span class="lineno">14450</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceType,%u\n"</span>, devProps.deviceType);</div>
-<div class="line"><a name="l14451"></a><span class="lineno">14451</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceName,%s\n"</span>, devProps.deviceName);</div>
-<div class="line"><a name="l14452"></a><span class="lineno">14452</span>  </div>
-<div class="line"><a name="l14453"></a><span class="lineno">14453</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n"</span>, devProps.limits.maxMemoryAllocationCount);</div>
-<div class="line"><a name="l14454"></a><span class="lineno">14454</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,bufferImageGranularity,%llu\n"</span>, devProps.limits.bufferImageGranularity);</div>
-<div class="line"><a name="l14455"></a><span class="lineno">14455</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n"</span>, devProps.limits.nonCoherentAtomSize);</div>
-<div class="line"><a name="l14456"></a><span class="lineno">14456</span>  </div>
-<div class="line"><a name="l14457"></a><span class="lineno">14457</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,HeapCount,%u\n"</span>, memProps.memoryHeapCount);</div>
-<div class="line"><a name="l14458"></a><span class="lineno">14458</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < memProps.memoryHeapCount; ++i)</div>
-<div class="line"><a name="l14459"></a><span class="lineno">14459</span>  {</div>
-<div class="line"><a name="l14460"></a><span class="lineno">14460</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Heap,%u,size,%llu\n"</span>, i, memProps.memoryHeaps[i].size);</div>
-<div class="line"><a name="l14461"></a><span class="lineno">14461</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Heap,%u,flags,%u\n"</span>, i, memProps.memoryHeaps[i].flags);</div>
-<div class="line"><a name="l14462"></a><span class="lineno">14462</span>  }</div>
-<div class="line"><a name="l14463"></a><span class="lineno">14463</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,TypeCount,%u\n"</span>, memProps.memoryTypeCount);</div>
-<div class="line"><a name="l14464"></a><span class="lineno">14464</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < memProps.memoryTypeCount; ++i)</div>
+<div class="line"><a name="l14414"></a><span class="lineno">14414</span>  VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l14415"></a><span class="lineno">14415</span>  fprintf(m_File, <span class="stringliteral">"%u,%.3f,%u,vmaSetPoolName,%p,%s\n"</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l14416"></a><span class="lineno">14416</span>  pool, name != VMA_NULL ? name : <span class="stringliteral">""</span>);</div>
+<div class="line"><a name="l14417"></a><span class="lineno">14417</span>  Flush();</div>
+<div class="line"><a name="l14418"></a><span class="lineno">14418</span> }</div>
+<div class="line"><a name="l14419"></a><span class="lineno">14419</span>  </div>
+<div class="line"><a name="l14420"></a><span class="lineno">14420</span> 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="l14421"></a><span class="lineno">14421</span> {</div>
+<div class="line"><a name="l14422"></a><span class="lineno">14422</span>  <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
+<div class="line"><a name="l14423"></a><span class="lineno">14423</span>  {</div>
+<div class="line"><a name="l14424"></a><span class="lineno">14424</span>  <span class="keywordflow">if</span>((allocFlags & <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="l14425"></a><span class="lineno">14425</span>  {</div>
+<div class="line"><a name="l14426"></a><span class="lineno">14426</span>  m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div>
+<div class="line"><a name="l14427"></a><span class="lineno">14427</span>  }</div>
+<div class="line"><a name="l14428"></a><span class="lineno">14428</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14429"></a><span class="lineno">14429</span>  {</div>
+<div class="line"><a name="l14430"></a><span class="lineno">14430</span>  sprintf_s(m_PtrStr, <span class="stringliteral">"%p"</span>, pUserData);</div>
+<div class="line"><a name="l14431"></a><span class="lineno">14431</span>  m_Str = m_PtrStr;</div>
+<div class="line"><a name="l14432"></a><span class="lineno">14432</span>  }</div>
+<div class="line"><a name="l14433"></a><span class="lineno">14433</span>  }</div>
+<div class="line"><a name="l14434"></a><span class="lineno">14434</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14435"></a><span class="lineno">14435</span>  {</div>
+<div class="line"><a name="l14436"></a><span class="lineno">14436</span>  m_Str = <span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l14437"></a><span class="lineno">14437</span>  }</div>
+<div class="line"><a name="l14438"></a><span class="lineno">14438</span> }</div>
+<div class="line"><a name="l14439"></a><span class="lineno">14439</span>  </div>
+<div class="line"><a name="l14440"></a><span class="lineno">14440</span> <span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div>
+<div class="line"><a name="l14441"></a><span class="lineno">14441</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties& devProps,</div>
+<div class="line"><a name="l14442"></a><span class="lineno">14442</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties& memProps,</div>
+<div class="line"><a name="l14443"></a><span class="lineno">14443</span>  uint32_t vulkanApiVersion,</div>
+<div class="line"><a name="l14444"></a><span class="lineno">14444</span>  <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
+<div class="line"><a name="l14445"></a><span class="lineno">14445</span>  <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
+<div class="line"><a name="l14446"></a><span class="lineno">14446</span>  <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled)</div>
+<div class="line"><a name="l14447"></a><span class="lineno">14447</span> {</div>
+<div class="line"><a name="l14448"></a><span class="lineno">14448</span>  fprintf(m_File, <span class="stringliteral">"Config,Begin\n"</span>);</div>
+<div class="line"><a name="l14449"></a><span class="lineno">14449</span>  </div>
+<div class="line"><a name="l14450"></a><span class="lineno">14450</span>  fprintf(m_File, <span class="stringliteral">"VulkanApiVersion,%u,%u\n"</span>, VK_VERSION_MAJOR(vulkanApiVersion), VK_VERSION_MINOR(vulkanApiVersion));</div>
+<div class="line"><a name="l14451"></a><span class="lineno">14451</span>  </div>
+<div class="line"><a name="l14452"></a><span class="lineno">14452</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,apiVersion,%u\n"</span>, devProps.apiVersion);</div>
+<div class="line"><a name="l14453"></a><span class="lineno">14453</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,driverVersion,%u\n"</span>, devProps.driverVersion);</div>
+<div class="line"><a name="l14454"></a><span class="lineno">14454</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,vendorID,%u\n"</span>, devProps.vendorID);</div>
+<div class="line"><a name="l14455"></a><span class="lineno">14455</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceID,%u\n"</span>, devProps.deviceID);</div>
+<div class="line"><a name="l14456"></a><span class="lineno">14456</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceType,%u\n"</span>, devProps.deviceType);</div>
+<div class="line"><a name="l14457"></a><span class="lineno">14457</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDevice,deviceName,%s\n"</span>, devProps.deviceName);</div>
+<div class="line"><a name="l14458"></a><span class="lineno">14458</span>  </div>
+<div class="line"><a name="l14459"></a><span class="lineno">14459</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n"</span>, devProps.limits.maxMemoryAllocationCount);</div>
+<div class="line"><a name="l14460"></a><span class="lineno">14460</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,bufferImageGranularity,%llu\n"</span>, devProps.limits.bufferImageGranularity);</div>
+<div class="line"><a name="l14461"></a><span class="lineno">14461</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n"</span>, devProps.limits.nonCoherentAtomSize);</div>
+<div class="line"><a name="l14462"></a><span class="lineno">14462</span>  </div>
+<div class="line"><a name="l14463"></a><span class="lineno">14463</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,HeapCount,%u\n"</span>, memProps.memoryHeapCount);</div>
+<div class="line"><a name="l14464"></a><span class="lineno">14464</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < memProps.memoryHeapCount; ++i)</div>
<div class="line"><a name="l14465"></a><span class="lineno">14465</span>  {</div>
-<div class="line"><a name="l14466"></a><span class="lineno">14466</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Type,%u,heapIndex,%u\n"</span>, i, memProps.memoryTypes[i].heapIndex);</div>
-<div class="line"><a name="l14467"></a><span class="lineno">14467</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n"</span>, i, memProps.memoryTypes[i].propertyFlags);</div>
+<div class="line"><a name="l14466"></a><span class="lineno">14466</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Heap,%u,size,%llu\n"</span>, i, memProps.memoryHeaps[i].size);</div>
+<div class="line"><a name="l14467"></a><span class="lineno">14467</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Heap,%u,flags,%u\n"</span>, i, memProps.memoryHeaps[i].flags);</div>
<div class="line"><a name="l14468"></a><span class="lineno">14468</span>  }</div>
-<div class="line"><a name="l14469"></a><span class="lineno">14469</span>  </div>
-<div class="line"><a name="l14470"></a><span class="lineno">14470</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_KHR_dedicated_allocation,%u\n"</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l14471"></a><span class="lineno">14471</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_KHR_bind_memory2,%u\n"</span>, bindMemory2ExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l14472"></a><span class="lineno">14472</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_EXT_memory_budget,%u\n"</span>, memoryBudgetExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l14473"></a><span class="lineno">14473</span>  </div>
-<div class="line"><a name="l14474"></a><span class="lineno">14474</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n"</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div>
-<div class="line"><a name="l14475"></a><span class="lineno">14475</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_ALIGNMENT,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div>
-<div class="line"><a name="l14476"></a><span class="lineno">14476</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_MARGIN,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l14477"></a><span class="lineno">14477</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n"</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div>
-<div class="line"><a name="l14478"></a><span class="lineno">14478</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n"</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div>
-<div class="line"><a name="l14479"></a><span class="lineno">14479</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n"</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div>
-<div class="line"><a name="l14480"></a><span class="lineno">14480</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div>
-<div class="line"><a name="l14481"></a><span class="lineno">14481</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n"</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div>
-<div class="line"><a name="l14482"></a><span class="lineno">14482</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n"</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
-<div class="line"><a name="l14483"></a><span class="lineno">14483</span>  </div>
-<div class="line"><a name="l14484"></a><span class="lineno">14484</span>  fprintf(m_File, <span class="stringliteral">"Config,End\n"</span>);</div>
-<div class="line"><a name="l14485"></a><span class="lineno">14485</span> }</div>
-<div class="line"><a name="l14486"></a><span class="lineno">14486</span>  </div>
-<div class="line"><a name="l14487"></a><span class="lineno">14487</span> <span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams& outParams)</div>
-<div class="line"><a name="l14488"></a><span class="lineno">14488</span> {</div>
-<div class="line"><a name="l14489"></a><span class="lineno">14489</span>  outParams.threadId = GetCurrentThreadId();</div>
-<div class="line"><a name="l14490"></a><span class="lineno">14490</span>  </div>
-<div class="line"><a name="l14491"></a><span class="lineno">14491</span>  LARGE_INTEGER counter;</div>
-<div class="line"><a name="l14492"></a><span class="lineno">14492</span>  QueryPerformanceCounter(&counter);</div>
-<div class="line"><a name="l14493"></a><span class="lineno">14493</span>  outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div>
-<div class="line"><a name="l14494"></a><span class="lineno">14494</span> }</div>
-<div class="line"><a name="l14495"></a><span class="lineno">14495</span>  </div>
-<div class="line"><a name="l14496"></a><span class="lineno">14496</span> <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="l14497"></a><span class="lineno">14497</span> {</div>
-<div class="line"><a name="l14498"></a><span class="lineno">14498</span>  <span class="keywordflow">if</span>(count)</div>
-<div class="line"><a name="l14499"></a><span class="lineno">14499</span>  {</div>
-<div class="line"><a name="l14500"></a><span class="lineno">14500</span>  fprintf(m_File, <span class="stringliteral">"%p"</span>, pItems[0]);</div>
-<div class="line"><a name="l14501"></a><span class="lineno">14501</span>  <span class="keywordflow">for</span>(uint64_t i = 1; i < count; ++i)</div>
-<div class="line"><a name="l14502"></a><span class="lineno">14502</span>  {</div>
-<div class="line"><a name="l14503"></a><span class="lineno">14503</span>  fprintf(m_File, <span class="stringliteral">" %p"</span>, pItems[i]);</div>
-<div class="line"><a name="l14504"></a><span class="lineno">14504</span>  }</div>
-<div class="line"><a name="l14505"></a><span class="lineno">14505</span>  }</div>
-<div class="line"><a name="l14506"></a><span class="lineno">14506</span> }</div>
-<div class="line"><a name="l14507"></a><span class="lineno">14507</span>  </div>
-<div class="line"><a name="l14508"></a><span class="lineno">14508</span> <span class="keywordtype">void</span> VmaRecorder::Flush()</div>
-<div class="line"><a name="l14509"></a><span class="lineno">14509</span> {</div>
-<div class="line"><a name="l14510"></a><span class="lineno">14510</span>  <span class="keywordflow">if</span>((m_Flags & <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div>
-<div class="line"><a name="l14511"></a><span class="lineno">14511</span>  {</div>
-<div class="line"><a name="l14512"></a><span class="lineno">14512</span>  fflush(m_File);</div>
-<div class="line"><a name="l14513"></a><span class="lineno">14513</span>  }</div>
-<div class="line"><a name="l14514"></a><span class="lineno">14514</span> }</div>
-<div class="line"><a name="l14515"></a><span class="lineno">14515</span>  </div>
-<div class="line"><a name="l14516"></a><span class="lineno">14516</span> <span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l14517"></a><span class="lineno">14517</span>  </div>
-<div class="line"><a name="l14519"></a><span class="lineno">14519</span> <span class="comment">// VmaAllocationObjectAllocator</span></div>
-<div class="line"><a name="l14520"></a><span class="lineno">14520</span>  </div>
-<div class="line"><a name="l14521"></a><span class="lineno">14521</span> VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
-<div class="line"><a name="l14522"></a><span class="lineno">14522</span>  m_Allocator(pAllocationCallbacks, 1024)</div>
-<div class="line"><a name="l14523"></a><span class="lineno">14523</span> {</div>
-<div class="line"><a name="l14524"></a><span class="lineno">14524</span> }</div>
-<div class="line"><a name="l14525"></a><span class="lineno">14525</span>  </div>
-<div class="line"><a name="l14526"></a><span class="lineno">14526</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate()</div>
-<div class="line"><a name="l14527"></a><span class="lineno">14527</span> {</div>
-<div class="line"><a name="l14528"></a><span class="lineno">14528</span>  VmaMutexLock mutexLock(m_Mutex);</div>
-<div class="line"><a name="l14529"></a><span class="lineno">14529</span>  <span class="keywordflow">return</span> m_Allocator.Alloc();</div>
+<div class="line"><a name="l14469"></a><span class="lineno">14469</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,TypeCount,%u\n"</span>, memProps.memoryTypeCount);</div>
+<div class="line"><a name="l14470"></a><span class="lineno">14470</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < memProps.memoryTypeCount; ++i)</div>
+<div class="line"><a name="l14471"></a><span class="lineno">14471</span>  {</div>
+<div class="line"><a name="l14472"></a><span class="lineno">14472</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Type,%u,heapIndex,%u\n"</span>, i, memProps.memoryTypes[i].heapIndex);</div>
+<div class="line"><a name="l14473"></a><span class="lineno">14473</span>  fprintf(m_File, <span class="stringliteral">"PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n"</span>, i, memProps.memoryTypes[i].propertyFlags);</div>
+<div class="line"><a name="l14474"></a><span class="lineno">14474</span>  }</div>
+<div class="line"><a name="l14475"></a><span class="lineno">14475</span>  </div>
+<div class="line"><a name="l14476"></a><span class="lineno">14476</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_KHR_dedicated_allocation,%u\n"</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l14477"></a><span class="lineno">14477</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_KHR_bind_memory2,%u\n"</span>, bindMemory2ExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l14478"></a><span class="lineno">14478</span>  fprintf(m_File, <span class="stringliteral">"Extension,VK_EXT_memory_budget,%u\n"</span>, memoryBudgetExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l14479"></a><span class="lineno">14479</span>  </div>
+<div class="line"><a name="l14480"></a><span class="lineno">14480</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n"</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div>
+<div class="line"><a name="l14481"></a><span class="lineno">14481</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_ALIGNMENT,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div>
+<div class="line"><a name="l14482"></a><span class="lineno">14482</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_MARGIN,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l14483"></a><span class="lineno">14483</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n"</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div>
+<div class="line"><a name="l14484"></a><span class="lineno">14484</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n"</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div>
+<div class="line"><a name="l14485"></a><span class="lineno">14485</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n"</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div>
+<div class="line"><a name="l14486"></a><span class="lineno">14486</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n"</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div>
+<div class="line"><a name="l14487"></a><span class="lineno">14487</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n"</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div>
+<div class="line"><a name="l14488"></a><span class="lineno">14488</span>  fprintf(m_File, <span class="stringliteral">"Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n"</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
+<div class="line"><a name="l14489"></a><span class="lineno">14489</span>  </div>
+<div class="line"><a name="l14490"></a><span class="lineno">14490</span>  fprintf(m_File, <span class="stringliteral">"Config,End\n"</span>);</div>
+<div class="line"><a name="l14491"></a><span class="lineno">14491</span> }</div>
+<div class="line"><a name="l14492"></a><span class="lineno">14492</span>  </div>
+<div class="line"><a name="l14493"></a><span class="lineno">14493</span> <span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams& outParams)</div>
+<div class="line"><a name="l14494"></a><span class="lineno">14494</span> {</div>
+<div class="line"><a name="l14495"></a><span class="lineno">14495</span>  outParams.threadId = GetCurrentThreadId();</div>
+<div class="line"><a name="l14496"></a><span class="lineno">14496</span>  </div>
+<div class="line"><a name="l14497"></a><span class="lineno">14497</span>  LARGE_INTEGER counter;</div>
+<div class="line"><a name="l14498"></a><span class="lineno">14498</span>  QueryPerformanceCounter(&counter);</div>
+<div class="line"><a name="l14499"></a><span class="lineno">14499</span>  outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div>
+<div class="line"><a name="l14500"></a><span class="lineno">14500</span> }</div>
+<div class="line"><a name="l14501"></a><span class="lineno">14501</span>  </div>
+<div class="line"><a name="l14502"></a><span class="lineno">14502</span> <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="l14503"></a><span class="lineno">14503</span> {</div>
+<div class="line"><a name="l14504"></a><span class="lineno">14504</span>  <span class="keywordflow">if</span>(count)</div>
+<div class="line"><a name="l14505"></a><span class="lineno">14505</span>  {</div>
+<div class="line"><a name="l14506"></a><span class="lineno">14506</span>  fprintf(m_File, <span class="stringliteral">"%p"</span>, pItems[0]);</div>
+<div class="line"><a name="l14507"></a><span class="lineno">14507</span>  <span class="keywordflow">for</span>(uint64_t i = 1; i < count; ++i)</div>
+<div class="line"><a name="l14508"></a><span class="lineno">14508</span>  {</div>
+<div class="line"><a name="l14509"></a><span class="lineno">14509</span>  fprintf(m_File, <span class="stringliteral">" %p"</span>, pItems[i]);</div>
+<div class="line"><a name="l14510"></a><span class="lineno">14510</span>  }</div>
+<div class="line"><a name="l14511"></a><span class="lineno">14511</span>  }</div>
+<div class="line"><a name="l14512"></a><span class="lineno">14512</span> }</div>
+<div class="line"><a name="l14513"></a><span class="lineno">14513</span>  </div>
+<div class="line"><a name="l14514"></a><span class="lineno">14514</span> <span class="keywordtype">void</span> VmaRecorder::Flush()</div>
+<div class="line"><a name="l14515"></a><span class="lineno">14515</span> {</div>
+<div class="line"><a name="l14516"></a><span class="lineno">14516</span>  <span class="keywordflow">if</span>((m_Flags & <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div>
+<div class="line"><a name="l14517"></a><span class="lineno">14517</span>  {</div>
+<div class="line"><a name="l14518"></a><span class="lineno">14518</span>  fflush(m_File);</div>
+<div class="line"><a name="l14519"></a><span class="lineno">14519</span>  }</div>
+<div class="line"><a name="l14520"></a><span class="lineno">14520</span> }</div>
+<div class="line"><a name="l14521"></a><span class="lineno">14521</span>  </div>
+<div class="line"><a name="l14522"></a><span class="lineno">14522</span> <span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14523"></a><span class="lineno">14523</span>  </div>
+<div class="line"><a name="l14525"></a><span class="lineno">14525</span> <span class="comment">// VmaAllocationObjectAllocator</span></div>
+<div class="line"><a name="l14526"></a><span class="lineno">14526</span>  </div>
+<div class="line"><a name="l14527"></a><span class="lineno">14527</span> VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l14528"></a><span class="lineno">14528</span>  m_Allocator(pAllocationCallbacks, 1024)</div>
+<div class="line"><a name="l14529"></a><span class="lineno">14529</span> {</div>
<div class="line"><a name="l14530"></a><span class="lineno">14530</span> }</div>
<div class="line"><a name="l14531"></a><span class="lineno">14531</span>  </div>
-<div class="line"><a name="l14532"></a><span class="lineno">14532</span> <span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</div>
+<div class="line"><a name="l14532"></a><span class="lineno">14532</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate()</div>
<div class="line"><a name="l14533"></a><span class="lineno">14533</span> {</div>
<div class="line"><a name="l14534"></a><span class="lineno">14534</span>  VmaMutexLock mutexLock(m_Mutex);</div>
-<div class="line"><a name="l14535"></a><span class="lineno">14535</span>  m_Allocator.Free(hAlloc);</div>
+<div class="line"><a name="l14535"></a><span class="lineno">14535</span>  <span class="keywordflow">return</span> m_Allocator.Alloc();</div>
<div class="line"><a name="l14536"></a><span class="lineno">14536</span> }</div>
<div class="line"><a name="l14537"></a><span class="lineno">14537</span>  </div>
-<div class="line"><a name="l14539"></a><span class="lineno">14539</span> <span class="comment">// VmaAllocator_T</span></div>
-<div class="line"><a name="l14540"></a><span class="lineno">14540</span>  </div>
-<div class="line"><a name="l14541"></a><span class="lineno">14541</span> 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="l14542"></a><span class="lineno">14542</span>  m_UseMutex((pCreateInfo->flags & <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div>
-<div class="line"><a name="l14543"></a><span class="lineno">14543</span>  m_VulkanApiVersion(pCreateInfo->vulkanApiVersion != 0 ? pCreateInfo->vulkanApiVersion : VK_API_VERSION_1_0),</div>
-<div class="line"><a name="l14544"></a><span class="lineno">14544</span>  m_UseKhrDedicatedAllocation((pCreateInfo->flags & <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="l14545"></a><span class="lineno">14545</span>  m_UseKhrBindMemory2((pCreateInfo->flags & <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="l14546"></a><span class="lineno">14546</span>  m_UseExtMemoryBudget((pCreateInfo->flags & <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="l14547"></a><span class="lineno">14547</span>  m_hDevice(pCreateInfo->device),</div>
-<div class="line"><a name="l14548"></a><span class="lineno">14548</span>  m_hInstance(pCreateInfo->instance),</div>
-<div class="line"><a name="l14549"></a><span class="lineno">14549</span>  m_AllocationCallbacksSpecified(pCreateInfo->pAllocationCallbacks != VMA_NULL),</div>
-<div class="line"><a name="l14550"></a><span class="lineno">14550</span>  m_AllocationCallbacks(pCreateInfo->pAllocationCallbacks ?</div>
-<div class="line"><a name="l14551"></a><span class="lineno">14551</span>  *pCreateInfo->pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div>
-<div class="line"><a name="l14552"></a><span class="lineno">14552</span>  m_AllocationObjectAllocator(&m_AllocationCallbacks),</div>
-<div class="line"><a name="l14553"></a><span class="lineno">14553</span>  m_HeapSizeLimitMask(0),</div>
-<div class="line"><a name="l14554"></a><span class="lineno">14554</span>  m_PreferredLargeHeapBlockSize(0),</div>
-<div class="line"><a name="l14555"></a><span class="lineno">14555</span>  m_PhysicalDevice(pCreateInfo->physicalDevice),</div>
-<div class="line"><a name="l14556"></a><span class="lineno">14556</span>  m_CurrentFrameIndex(0),</div>
-<div class="line"><a name="l14557"></a><span class="lineno">14557</span>  m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div>
-<div class="line"><a name="l14558"></a><span class="lineno">14558</span>  m_Pools(VmaStlAllocator<<a class="code" href="struct_vma_pool.html">VmaPool</a>>(GetAllocationCallbacks())),</div>
-<div class="line"><a name="l14559"></a><span class="lineno">14559</span>  m_NextPoolId(0)</div>
-<div class="line"><a name="l14560"></a><span class="lineno">14560</span> #if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div>
-<div class="line"><a name="l14561"></a><span class="lineno">14561</span>  ,m_pRecorder(VMA_NULL)</div>
-<div class="line"><a name="l14562"></a><span class="lineno">14562</span> #endif</div>
-<div class="line"><a name="l14563"></a><span class="lineno">14563</span> {</div>
-<div class="line"><a name="l14564"></a><span class="lineno">14564</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l14565"></a><span class="lineno">14565</span>  {</div>
-<div class="line"><a name="l14566"></a><span class="lineno">14566</span>  m_UseKhrDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l14567"></a><span class="lineno">14567</span>  m_UseKhrBindMemory2 = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l14568"></a><span class="lineno">14568</span>  }</div>
-<div class="line"><a name="l14569"></a><span class="lineno">14569</span>  </div>
-<div class="line"><a name="l14570"></a><span class="lineno">14570</span>  <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div>
+<div class="line"><a name="l14538"></a><span class="lineno">14538</span> <span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</div>
+<div class="line"><a name="l14539"></a><span class="lineno">14539</span> {</div>
+<div class="line"><a name="l14540"></a><span class="lineno">14540</span>  VmaMutexLock mutexLock(m_Mutex);</div>
+<div class="line"><a name="l14541"></a><span class="lineno">14541</span>  m_Allocator.Free(hAlloc);</div>
+<div class="line"><a name="l14542"></a><span class="lineno">14542</span> }</div>
+<div class="line"><a name="l14543"></a><span class="lineno">14543</span>  </div>
+<div class="line"><a name="l14545"></a><span class="lineno">14545</span> <span class="comment">// VmaAllocator_T</span></div>
+<div class="line"><a name="l14546"></a><span class="lineno">14546</span>  </div>
+<div class="line"><a name="l14547"></a><span class="lineno">14547</span> 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="l14548"></a><span class="lineno">14548</span>  m_UseMutex((pCreateInfo->flags & <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div>
+<div class="line"><a name="l14549"></a><span class="lineno">14549</span>  m_VulkanApiVersion(pCreateInfo->vulkanApiVersion != 0 ? pCreateInfo->vulkanApiVersion : VK_API_VERSION_1_0),</div>
+<div class="line"><a name="l14550"></a><span class="lineno">14550</span>  m_UseKhrDedicatedAllocation((pCreateInfo->flags & <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="l14551"></a><span class="lineno">14551</span>  m_UseKhrBindMemory2((pCreateInfo->flags & <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="l14552"></a><span class="lineno">14552</span>  m_UseExtMemoryBudget((pCreateInfo->flags & <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="l14553"></a><span class="lineno">14553</span>  m_hDevice(pCreateInfo->device),</div>
+<div class="line"><a name="l14554"></a><span class="lineno">14554</span>  m_hInstance(pCreateInfo->instance),</div>
+<div class="line"><a name="l14555"></a><span class="lineno">14555</span>  m_AllocationCallbacksSpecified(pCreateInfo->pAllocationCallbacks != VMA_NULL),</div>
+<div class="line"><a name="l14556"></a><span class="lineno">14556</span>  m_AllocationCallbacks(pCreateInfo->pAllocationCallbacks ?</div>
+<div class="line"><a name="l14557"></a><span class="lineno">14557</span>  *pCreateInfo->pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div>
+<div class="line"><a name="l14558"></a><span class="lineno">14558</span>  m_AllocationObjectAllocator(&m_AllocationCallbacks),</div>
+<div class="line"><a name="l14559"></a><span class="lineno">14559</span>  m_HeapSizeLimitMask(0),</div>
+<div class="line"><a name="l14560"></a><span class="lineno">14560</span>  m_PreferredLargeHeapBlockSize(0),</div>
+<div class="line"><a name="l14561"></a><span class="lineno">14561</span>  m_PhysicalDevice(pCreateInfo->physicalDevice),</div>
+<div class="line"><a name="l14562"></a><span class="lineno">14562</span>  m_CurrentFrameIndex(0),</div>
+<div class="line"><a name="l14563"></a><span class="lineno">14563</span>  m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div>
+<div class="line"><a name="l14564"></a><span class="lineno">14564</span>  m_Pools(VmaStlAllocator<<a class="code" href="struct_vma_pool.html">VmaPool</a>>(GetAllocationCallbacks())),</div>
+<div class="line"><a name="l14565"></a><span class="lineno">14565</span>  m_NextPoolId(0)</div>
+<div class="line"><a name="l14566"></a><span class="lineno">14566</span> #if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div>
+<div class="line"><a name="l14567"></a><span class="lineno">14567</span>  ,m_pRecorder(VMA_NULL)</div>
+<div class="line"><a name="l14568"></a><span class="lineno">14568</span> #endif</div>
+<div class="line"><a name="l14569"></a><span class="lineno">14569</span> {</div>
+<div class="line"><a name="l14570"></a><span class="lineno">14570</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
<div class="line"><a name="l14571"></a><span class="lineno">14571</span>  {</div>
-<div class="line"><a name="l14572"></a><span class="lineno">14572</span>  <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="l14573"></a><span class="lineno">14573</span>  VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div>
+<div class="line"><a name="l14572"></a><span class="lineno">14572</span>  m_UseKhrDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14573"></a><span class="lineno">14573</span>  m_UseKhrBindMemory2 = <span class="keyword">false</span>;</div>
<div class="line"><a name="l14574"></a><span class="lineno">14574</span>  }</div>
<div class="line"><a name="l14575"></a><span class="lineno">14575</span>  </div>
-<div class="line"><a name="l14576"></a><span class="lineno">14576</span>  VMA_ASSERT(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> && pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);</div>
-<div class="line"><a name="l14577"></a><span class="lineno">14577</span>  </div>
-<div class="line"><a name="l14578"></a><span class="lineno">14578</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l14579"></a><span class="lineno">14579</span>  {</div>
-<div class="line"><a name="l14580"></a><span class="lineno">14580</span> <span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div>
-<div class="line"><a name="l14581"></a><span class="lineno">14581</span>  <span class="keywordflow">if</span>((pCreateInfo-><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>) != 0)</div>
-<div class="line"><a name="l14582"></a><span class="lineno">14582</span>  {</div>
-<div class="line"><a name="l14583"></a><span class="lineno">14583</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros."</span>);</div>
-<div class="line"><a name="l14584"></a><span class="lineno">14584</span>  }</div>
-<div class="line"><a name="l14585"></a><span class="lineno">14585</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14586"></a><span class="lineno">14586</span> <span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div>
-<div class="line"><a name="l14587"></a><span class="lineno">14587</span>  <span class="keywordflow">if</span>((pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> & <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="l14576"></a><span class="lineno">14576</span>  <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div>
+<div class="line"><a name="l14577"></a><span class="lineno">14577</span>  {</div>
+<div class="line"><a name="l14578"></a><span class="lineno">14578</span>  <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="l14579"></a><span class="lineno">14579</span>  VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div>
+<div class="line"><a name="l14580"></a><span class="lineno">14580</span>  }</div>
+<div class="line"><a name="l14581"></a><span class="lineno">14581</span>  </div>
+<div class="line"><a name="l14582"></a><span class="lineno">14582</span>  VMA_ASSERT(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> && pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);</div>
+<div class="line"><a name="l14583"></a><span class="lineno">14583</span>  </div>
+<div class="line"><a name="l14584"></a><span class="lineno">14584</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14585"></a><span class="lineno">14585</span>  {</div>
+<div class="line"><a name="l14586"></a><span class="lineno">14586</span> <span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div>
+<div class="line"><a name="l14587"></a><span class="lineno">14587</span>  <span class="keywordflow">if</span>((pCreateInfo-><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>) != 0)</div>
<div class="line"><a name="l14588"></a><span class="lineno">14588</span>  {</div>
-<div class="line"><a name="l14589"></a><span class="lineno">14589</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros."</span>);</div>
+<div class="line"><a name="l14589"></a><span class="lineno">14589</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros."</span>);</div>
<div class="line"><a name="l14590"></a><span class="lineno">14590</span>  }</div>
<div class="line"><a name="l14591"></a><span class="lineno">14591</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14592"></a><span class="lineno">14592</span>  }</div>
-<div class="line"><a name="l14593"></a><span class="lineno">14593</span> <span class="preprocessor">#if !(VMA_MEMORY_BUDGET)</span></div>
-<div class="line"><a name="l14594"></a><span class="lineno">14594</span>  <span class="keywordflow">if</span>((pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> & <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="l14595"></a><span class="lineno">14595</span>  {</div>
-<div class="line"><a name="l14596"></a><span class="lineno">14596</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros."</span>);</div>
-<div class="line"><a name="l14597"></a><span class="lineno">14597</span>  }</div>
-<div class="line"><a name="l14598"></a><span class="lineno">14598</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14599"></a><span class="lineno">14599</span> <span class="preprocessor">#if VMA_VULKAN_VERSION < 1001000</span></div>
-<div class="line"><a name="l14600"></a><span class="lineno">14600</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14592"></a><span class="lineno">14592</span> <span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div>
+<div class="line"><a name="l14593"></a><span class="lineno">14593</span>  <span class="keywordflow">if</span>((pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> & <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="l14594"></a><span class="lineno">14594</span>  {</div>
+<div class="line"><a name="l14595"></a><span class="lineno">14595</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros."</span>);</div>
+<div class="line"><a name="l14596"></a><span class="lineno">14596</span>  }</div>
+<div class="line"><a name="l14597"></a><span class="lineno">14597</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14598"></a><span class="lineno">14598</span>  }</div>
+<div class="line"><a name="l14599"></a><span class="lineno">14599</span> <span class="preprocessor">#if !(VMA_MEMORY_BUDGET)</span></div>
+<div class="line"><a name="l14600"></a><span class="lineno">14600</span>  <span class="keywordflow">if</span>((pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> & <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="l14601"></a><span class="lineno">14601</span>  {</div>
-<div class="line"><a name="l14602"></a><span class="lineno">14602</span>  VMA_ASSERT(0 && <span class="stringliteral">"vulkanApiVersion >= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros."</span>);</div>
+<div class="line"><a name="l14602"></a><span class="lineno">14602</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros."</span>);</div>
<div class="line"><a name="l14603"></a><span class="lineno">14603</span>  }</div>
<div class="line"><a name="l14604"></a><span class="lineno">14604</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14605"></a><span class="lineno">14605</span>  </div>
-<div class="line"><a name="l14606"></a><span class="lineno">14606</span>  memset(&m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div>
-<div class="line"><a name="l14607"></a><span class="lineno">14607</span>  memset(&m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div>
-<div class="line"><a name="l14608"></a><span class="lineno">14608</span>  memset(&m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div>
-<div class="line"><a name="l14609"></a><span class="lineno">14609</span>  </div>
-<div class="line"><a name="l14610"></a><span class="lineno">14610</span>  memset(&m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div>
-<div class="line"><a name="l14611"></a><span class="lineno">14611</span>  memset(&m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div>
-<div class="line"><a name="l14612"></a><span class="lineno">14612</span>  memset(&m_VulkanFunctions, 0, <span class="keyword">sizeof</span>(m_VulkanFunctions));</div>
-<div class="line"><a name="l14613"></a><span class="lineno">14613</span>  </div>
-<div class="line"><a name="l14614"></a><span class="lineno">14614</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div>
-<div class="line"><a name="l14615"></a><span class="lineno">14615</span>  {</div>
-<div class="line"><a name="l14616"></a><span class="lineno">14616</span>  m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-><a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
-<div class="line"><a name="l14617"></a><span class="lineno">14617</span>  m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-><a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
-<div class="line"><a name="l14618"></a><span class="lineno">14618</span>  }</div>
+<div class="line"><a name="l14605"></a><span class="lineno">14605</span> <span class="preprocessor">#if VMA_VULKAN_VERSION < 1001000</span></div>
+<div class="line"><a name="l14606"></a><span class="lineno">14606</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14607"></a><span class="lineno">14607</span>  {</div>
+<div class="line"><a name="l14608"></a><span class="lineno">14608</span>  VMA_ASSERT(0 && <span class="stringliteral">"vulkanApiVersion >= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros."</span>);</div>
+<div class="line"><a name="l14609"></a><span class="lineno">14609</span>  }</div>
+<div class="line"><a name="l14610"></a><span class="lineno">14610</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14611"></a><span class="lineno">14611</span>  </div>
+<div class="line"><a name="l14612"></a><span class="lineno">14612</span>  memset(&m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div>
+<div class="line"><a name="l14613"></a><span class="lineno">14613</span>  memset(&m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div>
+<div class="line"><a name="l14614"></a><span class="lineno">14614</span>  memset(&m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div>
+<div class="line"><a name="l14615"></a><span class="lineno">14615</span>  </div>
+<div class="line"><a name="l14616"></a><span class="lineno">14616</span>  memset(&m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div>
+<div class="line"><a name="l14617"></a><span class="lineno">14617</span>  memset(&m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div>
+<div class="line"><a name="l14618"></a><span class="lineno">14618</span>  memset(&m_VulkanFunctions, 0, <span class="keyword">sizeof</span>(m_VulkanFunctions));</div>
<div class="line"><a name="l14619"></a><span class="lineno">14619</span>  </div>
-<div class="line"><a name="l14620"></a><span class="lineno">14620</span>  ImportVulkanFunctions(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div>
-<div class="line"><a name="l14621"></a><span class="lineno">14621</span>  </div>
-<div class="line"><a name="l14622"></a><span class="lineno">14622</span>  (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &m_PhysicalDeviceProperties);</div>
-<div class="line"><a name="l14623"></a><span class="lineno">14623</span>  (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &m_MemProps);</div>
-<div class="line"><a name="l14624"></a><span class="lineno">14624</span>  </div>
-<div class="line"><a name="l14625"></a><span class="lineno">14625</span>  VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div>
-<div class="line"><a name="l14626"></a><span class="lineno">14626</span>  VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div>
-<div class="line"><a name="l14627"></a><span class="lineno">14627</span>  VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div>
-<div class="line"><a name="l14628"></a><span class="lineno">14628</span>  VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div>
-<div class="line"><a name="l14629"></a><span class="lineno">14629</span>  </div>
-<div class="line"><a name="l14630"></a><span class="lineno">14630</span>  m_PreferredLargeHeapBlockSize = (pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div>
-<div class="line"><a name="l14631"></a><span class="lineno">14631</span>  pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast<VkDeviceSize>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
-<div class="line"><a name="l14632"></a><span class="lineno">14632</span>  </div>
-<div class="line"><a name="l14633"></a><span class="lineno">14633</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div>
-<div class="line"><a name="l14634"></a><span class="lineno">14634</span>  {</div>
-<div class="line"><a name="l14635"></a><span class="lineno">14635</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l14636"></a><span class="lineno">14636</span>  {</div>
-<div class="line"><a name="l14637"></a><span class="lineno">14637</span>  <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div>
-<div class="line"><a name="l14638"></a><span class="lineno">14638</span>  <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l14639"></a><span class="lineno">14639</span>  {</div>
-<div class="line"><a name="l14640"></a><span class="lineno">14640</span>  m_HeapSizeLimitMask |= 1u << heapIndex;</div>
-<div class="line"><a name="l14641"></a><span class="lineno">14641</span>  <span class="keywordflow">if</span>(limit < m_MemProps.memoryHeaps[heapIndex].size)</div>
-<div class="line"><a name="l14642"></a><span class="lineno">14642</span>  {</div>
-<div class="line"><a name="l14643"></a><span class="lineno">14643</span>  m_MemProps.memoryHeaps[heapIndex].size = limit;</div>
-<div class="line"><a name="l14644"></a><span class="lineno">14644</span>  }</div>
-<div class="line"><a name="l14645"></a><span class="lineno">14645</span>  }</div>
-<div class="line"><a name="l14646"></a><span class="lineno">14646</span>  }</div>
-<div class="line"><a name="l14647"></a><span class="lineno">14647</span>  }</div>
-<div class="line"><a name="l14648"></a><span class="lineno">14648</span>  </div>
-<div class="line"><a name="l14649"></a><span class="lineno">14649</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l14650"></a><span class="lineno">14650</span>  {</div>
-<div class="line"><a name="l14651"></a><span class="lineno">14651</span>  <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div>
-<div class="line"><a name="l14652"></a><span class="lineno">14652</span>  </div>
-<div class="line"><a name="l14653"></a><span class="lineno">14653</span>  m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div>
-<div class="line"><a name="l14654"></a><span class="lineno">14654</span>  <span class="keyword">this</span>,</div>
-<div class="line"><a name="l14655"></a><span class="lineno">14655</span>  VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div>
-<div class="line"><a name="l14656"></a><span class="lineno">14656</span>  memTypeIndex,</div>
-<div class="line"><a name="l14657"></a><span class="lineno">14657</span>  preferredBlockSize,</div>
-<div class="line"><a name="l14658"></a><span class="lineno">14658</span>  0,</div>
-<div class="line"><a name="l14659"></a><span class="lineno">14659</span>  SIZE_MAX,</div>
-<div class="line"><a name="l14660"></a><span class="lineno">14660</span>  GetBufferImageGranularity(),</div>
-<div class="line"><a name="l14661"></a><span class="lineno">14661</span>  pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div>
-<div class="line"><a name="l14662"></a><span class="lineno">14662</span>  <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div>
-<div class="line"><a name="l14663"></a><span class="lineno">14663</span>  <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div>
-<div class="line"><a name="l14664"></a><span class="lineno">14664</span>  <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]->CreateMinBlocks here,</span></div>
-<div class="line"><a name="l14665"></a><span class="lineno">14665</span>  <span class="comment">// becase minBlockCount is 0.</span></div>
-<div class="line"><a name="l14666"></a><span class="lineno">14666</span>  m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator<VmaAllocation>(GetAllocationCallbacks()));</div>
-<div class="line"><a name="l14667"></a><span class="lineno">14667</span>  </div>
-<div class="line"><a name="l14668"></a><span class="lineno">14668</span>  }</div>
-<div class="line"><a name="l14669"></a><span class="lineno">14669</span> }</div>
-<div class="line"><a name="l14670"></a><span class="lineno">14670</span>  </div>
-<div class="line"><a name="l14671"></a><span class="lineno">14671</span> 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="l14672"></a><span class="lineno">14672</span> {</div>
-<div class="line"><a name="l14673"></a><span class="lineno">14673</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l14674"></a><span class="lineno">14674</span>  </div>
-<div class="line"><a name="l14675"></a><span class="lineno">14675</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &&</div>
-<div class="line"><a name="l14676"></a><span class="lineno">14676</span>  !VmaStrIsEmpty(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-><a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div>
-<div class="line"><a name="l14677"></a><span class="lineno">14677</span>  {</div>
-<div class="line"><a name="l14678"></a><span class="lineno">14678</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l14679"></a><span class="lineno">14679</span>  m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div>
-<div class="line"><a name="l14680"></a><span class="lineno">14680</span>  res = m_pRecorder->Init(*pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div>
-<div class="line"><a name="l14681"></a><span class="lineno">14681</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l14682"></a><span class="lineno">14682</span>  {</div>
-<div class="line"><a name="l14683"></a><span class="lineno">14683</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l14684"></a><span class="lineno">14684</span>  }</div>
-<div class="line"><a name="l14685"></a><span class="lineno">14685</span>  m_pRecorder->WriteConfiguration(</div>
-<div class="line"><a name="l14686"></a><span class="lineno">14686</span>  m_PhysicalDeviceProperties,</div>
-<div class="line"><a name="l14687"></a><span class="lineno">14687</span>  m_MemProps,</div>
-<div class="line"><a name="l14688"></a><span class="lineno">14688</span>  m_VulkanApiVersion,</div>
-<div class="line"><a name="l14689"></a><span class="lineno">14689</span>  m_UseKhrDedicatedAllocation,</div>
-<div class="line"><a name="l14690"></a><span class="lineno">14690</span>  m_UseKhrBindMemory2,</div>
-<div class="line"><a name="l14691"></a><span class="lineno">14691</span>  m_UseExtMemoryBudget);</div>
-<div class="line"><a name="l14692"></a><span class="lineno">14692</span>  m_pRecorder->RecordCreateAllocator(GetCurrentFrameIndex());</div>
-<div class="line"><a name="l14693"></a><span class="lineno">14693</span> <span class="preprocessor">#else</span></div>
-<div class="line"><a name="l14694"></a><span class="lineno">14694</span>  VMA_ASSERT(0 && <span class="stringliteral">"VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1."</span>);</div>
-<div class="line"><a name="l14695"></a><span class="lineno">14695</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l14696"></a><span class="lineno">14696</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14697"></a><span class="lineno">14697</span>  }</div>
-<div class="line"><a name="l14698"></a><span class="lineno">14698</span>  </div>
-<div class="line"><a name="l14699"></a><span class="lineno">14699</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l14700"></a><span class="lineno">14700</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l14701"></a><span class="lineno">14701</span>  {</div>
-<div class="line"><a name="l14702"></a><span class="lineno">14702</span>  UpdateVulkanBudget();</div>
+<div class="line"><a name="l14620"></a><span class="lineno">14620</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div>
+<div class="line"><a name="l14621"></a><span class="lineno">14621</span>  {</div>
+<div class="line"><a name="l14622"></a><span class="lineno">14622</span>  m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-><a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
+<div class="line"><a name="l14623"></a><span class="lineno">14623</span>  m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-><a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
+<div class="line"><a name="l14624"></a><span class="lineno">14624</span>  }</div>
+<div class="line"><a name="l14625"></a><span class="lineno">14625</span>  </div>
+<div class="line"><a name="l14626"></a><span class="lineno">14626</span>  ImportVulkanFunctions(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div>
+<div class="line"><a name="l14627"></a><span class="lineno">14627</span>  </div>
+<div class="line"><a name="l14628"></a><span class="lineno">14628</span>  (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &m_PhysicalDeviceProperties);</div>
+<div class="line"><a name="l14629"></a><span class="lineno">14629</span>  (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &m_MemProps);</div>
+<div class="line"><a name="l14630"></a><span class="lineno">14630</span>  </div>
+<div class="line"><a name="l14631"></a><span class="lineno">14631</span>  VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div>
+<div class="line"><a name="l14632"></a><span class="lineno">14632</span>  VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div>
+<div class="line"><a name="l14633"></a><span class="lineno">14633</span>  VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div>
+<div class="line"><a name="l14634"></a><span class="lineno">14634</span>  VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div>
+<div class="line"><a name="l14635"></a><span class="lineno">14635</span>  </div>
+<div class="line"><a name="l14636"></a><span class="lineno">14636</span>  m_PreferredLargeHeapBlockSize = (pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div>
+<div class="line"><a name="l14637"></a><span class="lineno">14637</span>  pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast<VkDeviceSize>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
+<div class="line"><a name="l14638"></a><span class="lineno">14638</span>  </div>
+<div class="line"><a name="l14639"></a><span class="lineno">14639</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div>
+<div class="line"><a name="l14640"></a><span class="lineno">14640</span>  {</div>
+<div class="line"><a name="l14641"></a><span class="lineno">14641</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l14642"></a><span class="lineno">14642</span>  {</div>
+<div class="line"><a name="l14643"></a><span class="lineno">14643</span>  <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div>
+<div class="line"><a name="l14644"></a><span class="lineno">14644</span>  <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l14645"></a><span class="lineno">14645</span>  {</div>
+<div class="line"><a name="l14646"></a><span class="lineno">14646</span>  m_HeapSizeLimitMask |= 1u << heapIndex;</div>
+<div class="line"><a name="l14647"></a><span class="lineno">14647</span>  <span class="keywordflow">if</span>(limit < m_MemProps.memoryHeaps[heapIndex].size)</div>
+<div class="line"><a name="l14648"></a><span class="lineno">14648</span>  {</div>
+<div class="line"><a name="l14649"></a><span class="lineno">14649</span>  m_MemProps.memoryHeaps[heapIndex].size = limit;</div>
+<div class="line"><a name="l14650"></a><span class="lineno">14650</span>  }</div>
+<div class="line"><a name="l14651"></a><span class="lineno">14651</span>  }</div>
+<div class="line"><a name="l14652"></a><span class="lineno">14652</span>  }</div>
+<div class="line"><a name="l14653"></a><span class="lineno">14653</span>  }</div>
+<div class="line"><a name="l14654"></a><span class="lineno">14654</span>  </div>
+<div class="line"><a name="l14655"></a><span class="lineno">14655</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l14656"></a><span class="lineno">14656</span>  {</div>
+<div class="line"><a name="l14657"></a><span class="lineno">14657</span>  <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div>
+<div class="line"><a name="l14658"></a><span class="lineno">14658</span>  </div>
+<div class="line"><a name="l14659"></a><span class="lineno">14659</span>  m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div>
+<div class="line"><a name="l14660"></a><span class="lineno">14660</span>  <span class="keyword">this</span>,</div>
+<div class="line"><a name="l14661"></a><span class="lineno">14661</span>  VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div>
+<div class="line"><a name="l14662"></a><span class="lineno">14662</span>  memTypeIndex,</div>
+<div class="line"><a name="l14663"></a><span class="lineno">14663</span>  preferredBlockSize,</div>
+<div class="line"><a name="l14664"></a><span class="lineno">14664</span>  0,</div>
+<div class="line"><a name="l14665"></a><span class="lineno">14665</span>  SIZE_MAX,</div>
+<div class="line"><a name="l14666"></a><span class="lineno">14666</span>  GetBufferImageGranularity(),</div>
+<div class="line"><a name="l14667"></a><span class="lineno">14667</span>  pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div>
+<div class="line"><a name="l14668"></a><span class="lineno">14668</span>  <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div>
+<div class="line"><a name="l14669"></a><span class="lineno">14669</span>  <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div>
+<div class="line"><a name="l14670"></a><span class="lineno">14670</span>  <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]->CreateMinBlocks here,</span></div>
+<div class="line"><a name="l14671"></a><span class="lineno">14671</span>  <span class="comment">// becase minBlockCount is 0.</span></div>
+<div class="line"><a name="l14672"></a><span class="lineno">14672</span>  m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator<VmaAllocation>(GetAllocationCallbacks()));</div>
+<div class="line"><a name="l14673"></a><span class="lineno">14673</span>  </div>
+<div class="line"><a name="l14674"></a><span class="lineno">14674</span>  }</div>
+<div class="line"><a name="l14675"></a><span class="lineno">14675</span> }</div>
+<div class="line"><a name="l14676"></a><span class="lineno">14676</span>  </div>
+<div class="line"><a name="l14677"></a><span class="lineno">14677</span> 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="l14678"></a><span class="lineno">14678</span> {</div>
+<div class="line"><a name="l14679"></a><span class="lineno">14679</span>  VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l14680"></a><span class="lineno">14680</span>  </div>
+<div class="line"><a name="l14681"></a><span class="lineno">14681</span>  <span class="keywordflow">if</span>(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &&</div>
+<div class="line"><a name="l14682"></a><span class="lineno">14682</span>  !VmaStrIsEmpty(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-><a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div>
+<div class="line"><a name="l14683"></a><span class="lineno">14683</span>  {</div>
+<div class="line"><a name="l14684"></a><span class="lineno">14684</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14685"></a><span class="lineno">14685</span>  m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div>
+<div class="line"><a name="l14686"></a><span class="lineno">14686</span>  res = m_pRecorder->Init(*pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div>
+<div class="line"><a name="l14687"></a><span class="lineno">14687</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l14688"></a><span class="lineno">14688</span>  {</div>
+<div class="line"><a name="l14689"></a><span class="lineno">14689</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14690"></a><span class="lineno">14690</span>  }</div>
+<div class="line"><a name="l14691"></a><span class="lineno">14691</span>  m_pRecorder->WriteConfiguration(</div>
+<div class="line"><a name="l14692"></a><span class="lineno">14692</span>  m_PhysicalDeviceProperties,</div>
+<div class="line"><a name="l14693"></a><span class="lineno">14693</span>  m_MemProps,</div>
+<div class="line"><a name="l14694"></a><span class="lineno">14694</span>  m_VulkanApiVersion,</div>
+<div class="line"><a name="l14695"></a><span class="lineno">14695</span>  m_UseKhrDedicatedAllocation,</div>
+<div class="line"><a name="l14696"></a><span class="lineno">14696</span>  m_UseKhrBindMemory2,</div>
+<div class="line"><a name="l14697"></a><span class="lineno">14697</span>  m_UseExtMemoryBudget);</div>
+<div class="line"><a name="l14698"></a><span class="lineno">14698</span>  m_pRecorder->RecordCreateAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l14699"></a><span class="lineno">14699</span> <span class="preprocessor">#else</span></div>
+<div class="line"><a name="l14700"></a><span class="lineno">14700</span>  VMA_ASSERT(0 && <span class="stringliteral">"VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1."</span>);</div>
+<div class="line"><a name="l14701"></a><span class="lineno">14701</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l14702"></a><span class="lineno">14702</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l14703"></a><span class="lineno">14703</span>  }</div>
-<div class="line"><a name="l14704"></a><span class="lineno">14704</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l14705"></a><span class="lineno">14705</span>  </div>
-<div class="line"><a name="l14706"></a><span class="lineno">14706</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l14707"></a><span class="lineno">14707</span> }</div>
-<div class="line"><a name="l14708"></a><span class="lineno">14708</span>  </div>
-<div class="line"><a name="l14709"></a><span class="lineno">14709</span> VmaAllocator_T::~VmaAllocator_T()</div>
-<div class="line"><a name="l14710"></a><span class="lineno">14710</span> {</div>
-<div class="line"><a name="l14711"></a><span class="lineno">14711</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l14712"></a><span class="lineno">14712</span>  <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div>
-<div class="line"><a name="l14713"></a><span class="lineno">14713</span>  {</div>
-<div class="line"><a name="l14714"></a><span class="lineno">14714</span>  m_pRecorder->RecordDestroyAllocator(GetCurrentFrameIndex());</div>
-<div class="line"><a name="l14715"></a><span class="lineno">14715</span>  vma_delete(<span class="keyword">this</span>, m_pRecorder);</div>
-<div class="line"><a name="l14716"></a><span class="lineno">14716</span>  }</div>
-<div class="line"><a name="l14717"></a><span class="lineno">14717</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14718"></a><span class="lineno">14718</span>  </div>
-<div class="line"><a name="l14719"></a><span class="lineno">14719</span>  VMA_ASSERT(m_Pools.empty());</div>
-<div class="line"><a name="l14720"></a><span class="lineno">14720</span>  </div>
-<div class="line"><a name="l14721"></a><span class="lineno">14721</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div>
-<div class="line"><a name="l14722"></a><span class="lineno">14722</span>  {</div>
-<div class="line"><a name="l14723"></a><span class="lineno">14723</span>  <span class="keywordflow">if</span>(m_pDedicatedAllocations[i] != VMA_NULL && !m_pDedicatedAllocations[i]->empty())</div>
-<div class="line"><a name="l14724"></a><span class="lineno">14724</span>  {</div>
-<div class="line"><a name="l14725"></a><span class="lineno">14725</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unfreed dedicated allocations found."</span>);</div>
-<div class="line"><a name="l14726"></a><span class="lineno">14726</span>  }</div>
-<div class="line"><a name="l14727"></a><span class="lineno">14727</span>  </div>
-<div class="line"><a name="l14728"></a><span class="lineno">14728</span>  vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div>
-<div class="line"><a name="l14729"></a><span class="lineno">14729</span>  vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div>
-<div class="line"><a name="l14730"></a><span class="lineno">14730</span>  }</div>
-<div class="line"><a name="l14731"></a><span class="lineno">14731</span> }</div>
-<div class="line"><a name="l14732"></a><span class="lineno">14732</span>  </div>
-<div class="line"><a name="l14733"></a><span class="lineno">14733</span> <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="l14734"></a><span class="lineno">14734</span> {</div>
-<div class="line"><a name="l14735"></a><span class="lineno">14735</span> <span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l14736"></a><span class="lineno">14736</span>  m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div>
-<div class="line"><a name="l14737"></a><span class="lineno">14737</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div>
-<div class="line"><a name="l14738"></a><span class="lineno">14738</span>  m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div>
-<div class="line"><a name="l14739"></a><span class="lineno">14739</span>  m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div>
-<div class="line"><a name="l14740"></a><span class="lineno">14740</span>  m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div>
-<div class="line"><a name="l14741"></a><span class="lineno">14741</span>  m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div>
-<div class="line"><a name="l14742"></a><span class="lineno">14742</span>  m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div>
-<div class="line"><a name="l14743"></a><span class="lineno">14743</span>  m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div>
-<div class="line"><a name="l14744"></a><span class="lineno">14744</span>  m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div>
-<div class="line"><a name="l14745"></a><span class="lineno">14745</span>  m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div>
-<div class="line"><a name="l14746"></a><span class="lineno">14746</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div>
-<div class="line"><a name="l14747"></a><span class="lineno">14747</span>  m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div>
-<div class="line"><a name="l14748"></a><span class="lineno">14748</span>  m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div>
-<div class="line"><a name="l14749"></a><span class="lineno">14749</span>  m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div>
-<div class="line"><a name="l14750"></a><span class="lineno">14750</span>  m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div>
-<div class="line"><a name="l14751"></a><span class="lineno">14751</span>  m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div>
-<div class="line"><a name="l14752"></a><span class="lineno">14752</span>  m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div>
-<div class="line"><a name="l14753"></a><span class="lineno">14753</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14754"></a><span class="lineno">14754</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l14755"></a><span class="lineno">14755</span>  {</div>
-<div class="line"><a name="l14756"></a><span class="lineno">14756</span>  VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l14757"></a><span class="lineno">14757</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div>
-<div class="line"><a name="l14758"></a><span class="lineno">14758</span>  (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetBufferMemoryRequirements2"</span>);</div>
-<div class="line"><a name="l14759"></a><span class="lineno">14759</span>  m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div>
-<div class="line"><a name="l14760"></a><span class="lineno">14760</span>  (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetImageMemoryRequirements2"</span>);</div>
-<div class="line"><a name="l14761"></a><span class="lineno">14761</span>  m_VulkanFunctions.vkBindBufferMemory2KHR =</div>
-<div class="line"><a name="l14762"></a><span class="lineno">14762</span>  (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindBufferMemory2"</span>);</div>
-<div class="line"><a name="l14763"></a><span class="lineno">14763</span>  m_VulkanFunctions.vkBindImageMemory2KHR =</div>
-<div class="line"><a name="l14764"></a><span class="lineno">14764</span>  (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindImageMemory2"</span>);</div>
-<div class="line"><a name="l14765"></a><span class="lineno">14765</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =</div>
-<div class="line"><a name="l14766"></a><span class="lineno">14766</span>  (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, <span class="stringliteral">"vkGetPhysicalDeviceMemoryProperties2"</span>);</div>
-<div class="line"><a name="l14767"></a><span class="lineno">14767</span>  }</div>
-<div class="line"><a name="l14768"></a><span class="lineno">14768</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14769"></a><span class="lineno">14769</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
-<div class="line"><a name="l14770"></a><span class="lineno">14770</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
-<div class="line"><a name="l14771"></a><span class="lineno">14771</span>  {</div>
-<div class="line"><a name="l14772"></a><span class="lineno">14772</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div>
-<div class="line"><a name="l14773"></a><span class="lineno">14773</span>  (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetBufferMemoryRequirements2KHR"</span>);</div>
-<div class="line"><a name="l14774"></a><span class="lineno">14774</span>  m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div>
-<div class="line"><a name="l14775"></a><span class="lineno">14775</span>  (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetImageMemoryRequirements2KHR"</span>);</div>
-<div class="line"><a name="l14776"></a><span class="lineno">14776</span>  }</div>
-<div class="line"><a name="l14777"></a><span class="lineno">14777</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14778"></a><span class="lineno">14778</span> <span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l14779"></a><span class="lineno">14779</span>  <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
-<div class="line"><a name="l14780"></a><span class="lineno">14780</span>  {</div>
-<div class="line"><a name="l14781"></a><span class="lineno">14781</span>  m_VulkanFunctions.vkBindBufferMemory2KHR =</div>
-<div class="line"><a name="l14782"></a><span class="lineno">14782</span>  (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindBufferMemory2KHR"</span>);</div>
-<div class="line"><a name="l14783"></a><span class="lineno">14783</span>  m_VulkanFunctions.vkBindImageMemory2KHR =</div>
-<div class="line"><a name="l14784"></a><span class="lineno">14784</span>  (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindImageMemory2KHR"</span>);</div>
-<div class="line"><a name="l14785"></a><span class="lineno">14785</span>  }</div>
-<div class="line"><a name="l14786"></a><span class="lineno">14786</span> <span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l14787"></a><span class="lineno">14787</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l14788"></a><span class="lineno">14788</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget && m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l14789"></a><span class="lineno">14789</span>  {</div>
-<div class="line"><a name="l14790"></a><span class="lineno">14790</span>  VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l14791"></a><span class="lineno">14791</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =</div>
-<div class="line"><a name="l14792"></a><span class="lineno">14792</span>  (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, <span class="stringliteral">"vkGetPhysicalDeviceMemoryProperties2KHR"</span>);</div>
-<div class="line"><a name="l14793"></a><span class="lineno">14793</span>  }</div>
-<div class="line"><a name="l14794"></a><span class="lineno">14794</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l14795"></a><span class="lineno">14795</span> <span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l14796"></a><span class="lineno">14796</span>  </div>
-<div class="line"><a name="l14797"></a><span class="lineno">14797</span> <span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div>
-<div class="line"><a name="l14798"></a><span class="lineno">14798</span> <span class="preprocessor"> if(pVulkanFunctions->funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions->funcName;</span></div>
-<div class="line"><a name="l14799"></a><span class="lineno">14799</span>  </div>
-<div class="line"><a name="l14800"></a><span class="lineno">14800</span>  <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div>
-<div class="line"><a name="l14801"></a><span class="lineno">14801</span>  {</div>
-<div class="line"><a name="l14802"></a><span class="lineno">14802</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div>
-<div class="line"><a name="l14803"></a><span class="lineno">14803</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div>
-<div class="line"><a name="l14804"></a><span class="lineno">14804</span>  VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div>
-<div class="line"><a name="l14805"></a><span class="lineno">14805</span>  VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div>
-<div class="line"><a name="l14806"></a><span class="lineno">14806</span>  VMA_COPY_IF_NOT_NULL(vkMapMemory);</div>
-<div class="line"><a name="l14807"></a><span class="lineno">14807</span>  VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div>
-<div class="line"><a name="l14808"></a><span class="lineno">14808</span>  VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div>
-<div class="line"><a name="l14809"></a><span class="lineno">14809</span>  VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div>
-<div class="line"><a name="l14810"></a><span class="lineno">14810</span>  VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div>
-<div class="line"><a name="l14811"></a><span class="lineno">14811</span>  VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div>
-<div class="line"><a name="l14812"></a><span class="lineno">14812</span>  VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div>
-<div class="line"><a name="l14813"></a><span class="lineno">14813</span>  VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div>
-<div class="line"><a name="l14814"></a><span class="lineno">14814</span>  VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div>
-<div class="line"><a name="l14815"></a><span class="lineno">14815</span>  VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div>
-<div class="line"><a name="l14816"></a><span class="lineno">14816</span>  VMA_COPY_IF_NOT_NULL(vkCreateImage);</div>
-<div class="line"><a name="l14817"></a><span class="lineno">14817</span>  VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div>
-<div class="line"><a name="l14818"></a><span class="lineno">14818</span>  VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div>
-<div class="line"><a name="l14819"></a><span class="lineno">14819</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14820"></a><span class="lineno">14820</span>  VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div>
-<div class="line"><a name="l14821"></a><span class="lineno">14821</span>  VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div>
-<div class="line"><a name="l14822"></a><span class="lineno">14822</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14823"></a><span class="lineno">14823</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14824"></a><span class="lineno">14824</span>  VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div>
-<div class="line"><a name="l14825"></a><span class="lineno">14825</span>  VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div>
-<div class="line"><a name="l14826"></a><span class="lineno">14826</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14827"></a><span class="lineno">14827</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l14828"></a><span class="lineno">14828</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);</div>
-<div class="line"><a name="l14829"></a><span class="lineno">14829</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14830"></a><span class="lineno">14830</span>  }</div>
-<div class="line"><a name="l14831"></a><span class="lineno">14831</span>  </div>
-<div class="line"><a name="l14832"></a><span class="lineno">14832</span> <span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div>
-<div class="line"><a name="l14833"></a><span class="lineno">14833</span>  </div>
-<div class="line"><a name="l14834"></a><span class="lineno">14834</span>  <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div>
-<div class="line"><a name="l14835"></a><span class="lineno">14835</span>  <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div>
-<div class="line"><a name="l14836"></a><span class="lineno">14836</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div>
-<div class="line"><a name="l14837"></a><span class="lineno">14837</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div>
-<div class="line"><a name="l14838"></a><span class="lineno">14838</span>  VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div>
-<div class="line"><a name="l14839"></a><span class="lineno">14839</span>  VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div>
-<div class="line"><a name="l14840"></a><span class="lineno">14840</span>  VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div>
-<div class="line"><a name="l14841"></a><span class="lineno">14841</span>  VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div>
-<div class="line"><a name="l14842"></a><span class="lineno">14842</span>  VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div>
-<div class="line"><a name="l14843"></a><span class="lineno">14843</span>  VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div>
-<div class="line"><a name="l14844"></a><span class="lineno">14844</span>  VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div>
-<div class="line"><a name="l14845"></a><span class="lineno">14845</span>  VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div>
-<div class="line"><a name="l14846"></a><span class="lineno">14846</span>  VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div>
-<div class="line"><a name="l14847"></a><span class="lineno">14847</span>  VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div>
-<div class="line"><a name="l14848"></a><span class="lineno">14848</span>  VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div>
-<div class="line"><a name="l14849"></a><span class="lineno">14849</span>  VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div>
-<div class="line"><a name="l14850"></a><span class="lineno">14850</span>  VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div>
-<div class="line"><a name="l14851"></a><span class="lineno">14851</span>  VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div>
-<div class="line"><a name="l14852"></a><span class="lineno">14852</span>  VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div>
-<div class="line"><a name="l14853"></a><span class="lineno">14853</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14854"></a><span class="lineno">14854</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)</div>
-<div class="line"><a name="l14855"></a><span class="lineno">14855</span>  {</div>
-<div class="line"><a name="l14856"></a><span class="lineno">14856</span>  VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div>
-<div class="line"><a name="l14857"></a><span class="lineno">14857</span>  VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div>
-<div class="line"><a name="l14858"></a><span class="lineno">14858</span>  }</div>
-<div class="line"><a name="l14859"></a><span class="lineno">14859</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14860"></a><span class="lineno">14860</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14861"></a><span class="lineno">14861</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)</div>
-<div class="line"><a name="l14862"></a><span class="lineno">14862</span>  {</div>
-<div class="line"><a name="l14863"></a><span class="lineno">14863</span>  VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div>
-<div class="line"><a name="l14864"></a><span class="lineno">14864</span>  VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</div>
-<div class="line"><a name="l14865"></a><span class="lineno">14865</span>  }</div>
-<div class="line"><a name="l14866"></a><span class="lineno">14866</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14867"></a><span class="lineno">14867</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l14868"></a><span class="lineno">14868</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l14869"></a><span class="lineno">14869</span>  {</div>
-<div class="line"><a name="l14870"></a><span class="lineno">14870</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14704"></a><span class="lineno">14704</span>  </div>
+<div class="line"><a name="l14705"></a><span class="lineno">14705</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14706"></a><span class="lineno">14706</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l14707"></a><span class="lineno">14707</span>  {</div>
+<div class="line"><a name="l14708"></a><span class="lineno">14708</span>  UpdateVulkanBudget();</div>
+<div class="line"><a name="l14709"></a><span class="lineno">14709</span>  }</div>
+<div class="line"><a name="l14710"></a><span class="lineno">14710</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14711"></a><span class="lineno">14711</span>  </div>
+<div class="line"><a name="l14712"></a><span class="lineno">14712</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14713"></a><span class="lineno">14713</span> }</div>
+<div class="line"><a name="l14714"></a><span class="lineno">14714</span>  </div>
+<div class="line"><a name="l14715"></a><span class="lineno">14715</span> VmaAllocator_T::~VmaAllocator_T()</div>
+<div class="line"><a name="l14716"></a><span class="lineno">14716</span> {</div>
+<div class="line"><a name="l14717"></a><span class="lineno">14717</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l14718"></a><span class="lineno">14718</span>  <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div>
+<div class="line"><a name="l14719"></a><span class="lineno">14719</span>  {</div>
+<div class="line"><a name="l14720"></a><span class="lineno">14720</span>  m_pRecorder->RecordDestroyAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l14721"></a><span class="lineno">14721</span>  vma_delete(<span class="keyword">this</span>, m_pRecorder);</div>
+<div class="line"><a name="l14722"></a><span class="lineno">14722</span>  }</div>
+<div class="line"><a name="l14723"></a><span class="lineno">14723</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14724"></a><span class="lineno">14724</span>  </div>
+<div class="line"><a name="l14725"></a><span class="lineno">14725</span>  VMA_ASSERT(m_Pools.empty());</div>
+<div class="line"><a name="l14726"></a><span class="lineno">14726</span>  </div>
+<div class="line"><a name="l14727"></a><span class="lineno">14727</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div>
+<div class="line"><a name="l14728"></a><span class="lineno">14728</span>  {</div>
+<div class="line"><a name="l14729"></a><span class="lineno">14729</span>  <span class="keywordflow">if</span>(m_pDedicatedAllocations[i] != VMA_NULL && !m_pDedicatedAllocations[i]->empty())</div>
+<div class="line"><a name="l14730"></a><span class="lineno">14730</span>  {</div>
+<div class="line"><a name="l14731"></a><span class="lineno">14731</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unfreed dedicated allocations found."</span>);</div>
+<div class="line"><a name="l14732"></a><span class="lineno">14732</span>  }</div>
+<div class="line"><a name="l14733"></a><span class="lineno">14733</span>  </div>
+<div class="line"><a name="l14734"></a><span class="lineno">14734</span>  vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div>
+<div class="line"><a name="l14735"></a><span class="lineno">14735</span>  vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div>
+<div class="line"><a name="l14736"></a><span class="lineno">14736</span>  }</div>
+<div class="line"><a name="l14737"></a><span class="lineno">14737</span> }</div>
+<div class="line"><a name="l14738"></a><span class="lineno">14738</span>  </div>
+<div class="line"><a name="l14739"></a><span class="lineno">14739</span> <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="l14740"></a><span class="lineno">14740</span> {</div>
+<div class="line"><a name="l14741"></a><span class="lineno">14741</span> <span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l14742"></a><span class="lineno">14742</span>  m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div>
+<div class="line"><a name="l14743"></a><span class="lineno">14743</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div>
+<div class="line"><a name="l14744"></a><span class="lineno">14744</span>  m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div>
+<div class="line"><a name="l14745"></a><span class="lineno">14745</span>  m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div>
+<div class="line"><a name="l14746"></a><span class="lineno">14746</span>  m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div>
+<div class="line"><a name="l14747"></a><span class="lineno">14747</span>  m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div>
+<div class="line"><a name="l14748"></a><span class="lineno">14748</span>  m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div>
+<div class="line"><a name="l14749"></a><span class="lineno">14749</span>  m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div>
+<div class="line"><a name="l14750"></a><span class="lineno">14750</span>  m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div>
+<div class="line"><a name="l14751"></a><span class="lineno">14751</span>  m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div>
+<div class="line"><a name="l14752"></a><span class="lineno">14752</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div>
+<div class="line"><a name="l14753"></a><span class="lineno">14753</span>  m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div>
+<div class="line"><a name="l14754"></a><span class="lineno">14754</span>  m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div>
+<div class="line"><a name="l14755"></a><span class="lineno">14755</span>  m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div>
+<div class="line"><a name="l14756"></a><span class="lineno">14756</span>  m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div>
+<div class="line"><a name="l14757"></a><span class="lineno">14757</span>  m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div>
+<div class="line"><a name="l14758"></a><span class="lineno">14758</span>  m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div>
+<div class="line"><a name="l14759"></a><span class="lineno">14759</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14760"></a><span class="lineno">14760</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14761"></a><span class="lineno">14761</span>  {</div>
+<div class="line"><a name="l14762"></a><span class="lineno">14762</span>  VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l14763"></a><span class="lineno">14763</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14764"></a><span class="lineno">14764</span>  (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetBufferMemoryRequirements2"</span>);</div>
+<div class="line"><a name="l14765"></a><span class="lineno">14765</span>  m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14766"></a><span class="lineno">14766</span>  (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetImageMemoryRequirements2"</span>);</div>
+<div class="line"><a name="l14767"></a><span class="lineno">14767</span>  m_VulkanFunctions.vkBindBufferMemory2KHR =</div>
+<div class="line"><a name="l14768"></a><span class="lineno">14768</span>  (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindBufferMemory2"</span>);</div>
+<div class="line"><a name="l14769"></a><span class="lineno">14769</span>  m_VulkanFunctions.vkBindImageMemory2KHR =</div>
+<div class="line"><a name="l14770"></a><span class="lineno">14770</span>  (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindImageMemory2"</span>);</div>
+<div class="line"><a name="l14771"></a><span class="lineno">14771</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =</div>
+<div class="line"><a name="l14772"></a><span class="lineno">14772</span>  (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, <span class="stringliteral">"vkGetPhysicalDeviceMemoryProperties2"</span>);</div>
+<div class="line"><a name="l14773"></a><span class="lineno">14773</span>  }</div>
+<div class="line"><a name="l14774"></a><span class="lineno">14774</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14775"></a><span class="lineno">14775</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l14776"></a><span class="lineno">14776</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14777"></a><span class="lineno">14777</span>  {</div>
+<div class="line"><a name="l14778"></a><span class="lineno">14778</span>  m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14779"></a><span class="lineno">14779</span>  (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetBufferMemoryRequirements2KHR"</span>);</div>
+<div class="line"><a name="l14780"></a><span class="lineno">14780</span>  m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div>
+<div class="line"><a name="l14781"></a><span class="lineno">14781</span>  (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkGetImageMemoryRequirements2KHR"</span>);</div>
+<div class="line"><a name="l14782"></a><span class="lineno">14782</span>  }</div>
+<div class="line"><a name="l14783"></a><span class="lineno">14783</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14784"></a><span class="lineno">14784</span> <span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14785"></a><span class="lineno">14785</span>  <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l14786"></a><span class="lineno">14786</span>  {</div>
+<div class="line"><a name="l14787"></a><span class="lineno">14787</span>  m_VulkanFunctions.vkBindBufferMemory2KHR =</div>
+<div class="line"><a name="l14788"></a><span class="lineno">14788</span>  (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindBufferMemory2KHR"</span>);</div>
+<div class="line"><a name="l14789"></a><span class="lineno">14789</span>  m_VulkanFunctions.vkBindImageMemory2KHR =</div>
+<div class="line"><a name="l14790"></a><span class="lineno">14790</span>  (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">"vkBindImageMemory2KHR"</span>);</div>
+<div class="line"><a name="l14791"></a><span class="lineno">14791</span>  }</div>
+<div class="line"><a name="l14792"></a><span class="lineno">14792</span> <span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l14793"></a><span class="lineno">14793</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14794"></a><span class="lineno">14794</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget && m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14795"></a><span class="lineno">14795</span>  {</div>
+<div class="line"><a name="l14796"></a><span class="lineno">14796</span>  VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l14797"></a><span class="lineno">14797</span>  m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =</div>
+<div class="line"><a name="l14798"></a><span class="lineno">14798</span>  (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, <span class="stringliteral">"vkGetPhysicalDeviceMemoryProperties2KHR"</span>);</div>
+<div class="line"><a name="l14799"></a><span class="lineno">14799</span>  }</div>
+<div class="line"><a name="l14800"></a><span class="lineno">14800</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14801"></a><span class="lineno">14801</span> <span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l14802"></a><span class="lineno">14802</span>  </div>
+<div class="line"><a name="l14803"></a><span class="lineno">14803</span> <span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div>
+<div class="line"><a name="l14804"></a><span class="lineno">14804</span> <span class="preprocessor"> if(pVulkanFunctions->funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions->funcName;</span></div>
+<div class="line"><a name="l14805"></a><span class="lineno">14805</span>  </div>
+<div class="line"><a name="l14806"></a><span class="lineno">14806</span>  <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div>
+<div class="line"><a name="l14807"></a><span class="lineno">14807</span>  {</div>
+<div class="line"><a name="l14808"></a><span class="lineno">14808</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div>
+<div class="line"><a name="l14809"></a><span class="lineno">14809</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l14810"></a><span class="lineno">14810</span>  VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div>
+<div class="line"><a name="l14811"></a><span class="lineno">14811</span>  VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div>
+<div class="line"><a name="l14812"></a><span class="lineno">14812</span>  VMA_COPY_IF_NOT_NULL(vkMapMemory);</div>
+<div class="line"><a name="l14813"></a><span class="lineno">14813</span>  VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div>
+<div class="line"><a name="l14814"></a><span class="lineno">14814</span>  VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div>
+<div class="line"><a name="l14815"></a><span class="lineno">14815</span>  VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div>
+<div class="line"><a name="l14816"></a><span class="lineno">14816</span>  VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div>
+<div class="line"><a name="l14817"></a><span class="lineno">14817</span>  VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div>
+<div class="line"><a name="l14818"></a><span class="lineno">14818</span>  VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div>
+<div class="line"><a name="l14819"></a><span class="lineno">14819</span>  VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div>
+<div class="line"><a name="l14820"></a><span class="lineno">14820</span>  VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div>
+<div class="line"><a name="l14821"></a><span class="lineno">14821</span>  VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div>
+<div class="line"><a name="l14822"></a><span class="lineno">14822</span>  VMA_COPY_IF_NOT_NULL(vkCreateImage);</div>
+<div class="line"><a name="l14823"></a><span class="lineno">14823</span>  VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div>
+<div class="line"><a name="l14824"></a><span class="lineno">14824</span>  VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div>
+<div class="line"><a name="l14825"></a><span class="lineno">14825</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14826"></a><span class="lineno">14826</span>  VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div>
+<div class="line"><a name="l14827"></a><span class="lineno">14827</span>  VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div>
+<div class="line"><a name="l14828"></a><span class="lineno">14828</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14829"></a><span class="lineno">14829</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14830"></a><span class="lineno">14830</span>  VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div>
+<div class="line"><a name="l14831"></a><span class="lineno">14831</span>  VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div>
+<div class="line"><a name="l14832"></a><span class="lineno">14832</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14833"></a><span class="lineno">14833</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l14834"></a><span class="lineno">14834</span>  VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);</div>
+<div class="line"><a name="l14835"></a><span class="lineno">14835</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14836"></a><span class="lineno">14836</span>  }</div>
+<div class="line"><a name="l14837"></a><span class="lineno">14837</span>  </div>
+<div class="line"><a name="l14838"></a><span class="lineno">14838</span> <span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div>
+<div class="line"><a name="l14839"></a><span class="lineno">14839</span>  </div>
+<div class="line"><a name="l14840"></a><span class="lineno">14840</span>  <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div>
+<div class="line"><a name="l14841"></a><span class="lineno">14841</span>  <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div>
+<div class="line"><a name="l14842"></a><span class="lineno">14842</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div>
+<div class="line"><a name="l14843"></a><span class="lineno">14843</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div>
+<div class="line"><a name="l14844"></a><span class="lineno">14844</span>  VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div>
+<div class="line"><a name="l14845"></a><span class="lineno">14845</span>  VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div>
+<div class="line"><a name="l14846"></a><span class="lineno">14846</span>  VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div>
+<div class="line"><a name="l14847"></a><span class="lineno">14847</span>  VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div>
+<div class="line"><a name="l14848"></a><span class="lineno">14848</span>  VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l14849"></a><span class="lineno">14849</span>  VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l14850"></a><span class="lineno">14850</span>  VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div>
+<div class="line"><a name="l14851"></a><span class="lineno">14851</span>  VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div>
+<div class="line"><a name="l14852"></a><span class="lineno">14852</span>  VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l14853"></a><span class="lineno">14853</span>  VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l14854"></a><span class="lineno">14854</span>  VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14855"></a><span class="lineno">14855</span>  VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14856"></a><span class="lineno">14856</span>  VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div>
+<div class="line"><a name="l14857"></a><span class="lineno">14857</span>  VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div>
+<div class="line"><a name="l14858"></a><span class="lineno">14858</span>  VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l14859"></a><span class="lineno">14859</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14860"></a><span class="lineno">14860</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l14861"></a><span class="lineno">14861</span>  {</div>
+<div class="line"><a name="l14862"></a><span class="lineno">14862</span>  VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14863"></a><span class="lineno">14863</span>  VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14864"></a><span class="lineno">14864</span>  }</div>
+<div class="line"><a name="l14865"></a><span class="lineno">14865</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14866"></a><span class="lineno">14866</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14867"></a><span class="lineno">14867</span>  <span class="keywordflow">if</span>(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l14868"></a><span class="lineno">14868</span>  {</div>
+<div class="line"><a name="l14869"></a><span class="lineno">14869</span>  VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14870"></a><span class="lineno">14870</span>  VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</div>
<div class="line"><a name="l14871"></a><span class="lineno">14871</span>  }</div>
<div class="line"><a name="l14872"></a><span class="lineno">14872</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14873"></a><span class="lineno">14873</span> }</div>
-<div class="line"><a name="l14874"></a><span class="lineno">14874</span>  </div>
-<div class="line"><a name="l14875"></a><span class="lineno">14875</span> VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div>
-<div class="line"><a name="l14876"></a><span class="lineno">14876</span> {</div>
-<div class="line"><a name="l14877"></a><span class="lineno">14877</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l14878"></a><span class="lineno">14878</span>  <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
-<div class="line"><a name="l14879"></a><span class="lineno">14879</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize <= VMA_SMALL_HEAP_MAX_SIZE;</div>
-<div class="line"><a name="l14880"></a><span class="lineno">14880</span>  <span class="keywordflow">return</span> VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);</div>
-<div class="line"><a name="l14881"></a><span class="lineno">14881</span> }</div>
-<div class="line"><a name="l14882"></a><span class="lineno">14882</span>  </div>
-<div class="line"><a name="l14883"></a><span class="lineno">14883</span> VkResult VmaAllocator_T::AllocateMemoryOfType(</div>
-<div class="line"><a name="l14884"></a><span class="lineno">14884</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l14885"></a><span class="lineno">14885</span>  VkDeviceSize alignment,</div>
-<div class="line"><a name="l14886"></a><span class="lineno">14886</span>  <span class="keywordtype">bool</span> dedicatedAllocation,</div>
-<div class="line"><a name="l14887"></a><span class="lineno">14887</span>  VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l14888"></a><span class="lineno">14888</span>  VkImage dedicatedImage,</div>
-<div class="line"><a name="l14889"></a><span class="lineno">14889</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l14890"></a><span class="lineno">14890</span>  uint32_t memTypeIndex,</div>
-<div class="line"><a name="l14891"></a><span class="lineno">14891</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l14892"></a><span class="lineno">14892</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l14893"></a><span class="lineno">14893</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l14894"></a><span class="lineno">14894</span> {</div>
-<div class="line"><a name="l14895"></a><span class="lineno">14895</span>  VMA_ASSERT(pAllocations != VMA_NULL);</div>
-<div class="line"><a name="l14896"></a><span class="lineno">14896</span>  VMA_DEBUG_LOG(<span class="stringliteral">" AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu"</span>, memTypeIndex, allocationCount, size);</div>
-<div class="line"><a name="l14897"></a><span class="lineno">14897</span>  </div>
-<div class="line"><a name="l14898"></a><span class="lineno">14898</span>  <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div>
-<div class="line"><a name="l14899"></a><span class="lineno">14899</span>  </div>
-<div class="line"><a name="l14900"></a><span class="lineno">14900</span>  <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
-<div class="line"><a name="l14901"></a><span class="lineno">14901</span>  <span class="keywordflow">if</span>((finalCreateInfo.<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>) != 0 &&</div>
-<div class="line"><a name="l14902"></a><span class="lineno">14902</span>  (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l14903"></a><span class="lineno">14903</span>  {</div>
-<div class="line"><a name="l14904"></a><span class="lineno">14904</span>  finalCreateInfo.<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"><a name="l14905"></a><span class="lineno">14905</span>  }</div>
-<div class="line"><a name="l14906"></a><span class="lineno">14906</span>  <span class="comment">// If memory is lazily allocated, it should be always dedicated.</span></div>
-<div class="line"><a name="l14907"></a><span class="lineno">14907</span>  <span class="keywordflow">if</span>(finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> == <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>)</div>
-<div class="line"><a name="l14908"></a><span class="lineno">14908</span>  {</div>
-<div class="line"><a name="l14909"></a><span class="lineno">14909</span>  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="l14910"></a><span class="lineno">14910</span>  }</div>
-<div class="line"><a name="l14911"></a><span class="lineno">14911</span>  </div>
-<div class="line"><a name="l14912"></a><span class="lineno">14912</span>  VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l14913"></a><span class="lineno">14913</span>  VMA_ASSERT(blockVector);</div>
-<div class="line"><a name="l14914"></a><span class="lineno">14914</span>  </div>
-<div class="line"><a name="l14915"></a><span class="lineno">14915</span>  <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector->GetPreferredBlockSize();</div>
-<div class="line"><a name="l14916"></a><span class="lineno">14916</span>  <span class="keywordtype">bool</span> preferDedicatedMemory =</div>
-<div class="line"><a name="l14917"></a><span class="lineno">14917</span>  VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div>
-<div class="line"><a name="l14918"></a><span class="lineno">14918</span>  dedicatedAllocation ||</div>
-<div class="line"><a name="l14919"></a><span class="lineno">14919</span>  <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="l14920"></a><span class="lineno">14920</span>  size > preferredBlockSize / 2;</div>
-<div class="line"><a name="l14921"></a><span class="lineno">14921</span>  </div>
-<div class="line"><a name="l14922"></a><span class="lineno">14922</span>  <span class="keywordflow">if</span>(preferDedicatedMemory &&</div>
-<div class="line"><a name="l14923"></a><span class="lineno">14923</span>  (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &&</div>
-<div class="line"><a name="l14924"></a><span class="lineno">14924</span>  finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l14925"></a><span class="lineno">14925</span>  {</div>
-<div class="line"><a name="l14926"></a><span class="lineno">14926</span>  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="l14927"></a><span class="lineno">14927</span>  }</div>
-<div class="line"><a name="l14928"></a><span class="lineno">14928</span>  </div>
-<div class="line"><a name="l14929"></a><span class="lineno">14929</span>  <span class="keywordflow">if</span>((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>) != 0)</div>
-<div class="line"><a name="l14930"></a><span class="lineno">14930</span>  {</div>
-<div class="line"><a name="l14931"></a><span class="lineno">14931</span>  <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l14932"></a><span class="lineno">14932</span>  {</div>
-<div class="line"><a name="l14933"></a><span class="lineno">14933</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l14934"></a><span class="lineno">14934</span>  }</div>
-<div class="line"><a name="l14935"></a><span class="lineno">14935</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14936"></a><span class="lineno">14936</span>  {</div>
-<div class="line"><a name="l14937"></a><span class="lineno">14937</span>  <span class="keywordflow">return</span> AllocateDedicatedMemory(</div>
-<div class="line"><a name="l14938"></a><span class="lineno">14938</span>  size,</div>
-<div class="line"><a name="l14939"></a><span class="lineno">14939</span>  suballocType,</div>
-<div class="line"><a name="l14940"></a><span class="lineno">14940</span>  memTypeIndex,</div>
-<div class="line"><a name="l14941"></a><span class="lineno">14941</span>  (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
-<div class="line"><a name="l14942"></a><span class="lineno">14942</span>  (finalCreateInfo.<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>) != 0,</div>
-<div class="line"><a name="l14943"></a><span class="lineno">14943</span>  (finalCreateInfo.<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>) != 0,</div>
-<div class="line"><a name="l14944"></a><span class="lineno">14944</span>  finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l14945"></a><span class="lineno">14945</span>  dedicatedBuffer,</div>
-<div class="line"><a name="l14946"></a><span class="lineno">14946</span>  dedicatedImage,</div>
-<div class="line"><a name="l14947"></a><span class="lineno">14947</span>  allocationCount,</div>
-<div class="line"><a name="l14948"></a><span class="lineno">14948</span>  pAllocations);</div>
-<div class="line"><a name="l14949"></a><span class="lineno">14949</span>  }</div>
-<div class="line"><a name="l14950"></a><span class="lineno">14950</span>  }</div>
-<div class="line"><a name="l14951"></a><span class="lineno">14951</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14952"></a><span class="lineno">14952</span>  {</div>
-<div class="line"><a name="l14953"></a><span class="lineno">14953</span>  VkResult res = blockVector->Allocate(</div>
-<div class="line"><a name="l14954"></a><span class="lineno">14954</span>  m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l14955"></a><span class="lineno">14955</span>  size,</div>
-<div class="line"><a name="l14956"></a><span class="lineno">14956</span>  alignment,</div>
-<div class="line"><a name="l14957"></a><span class="lineno">14957</span>  finalCreateInfo,</div>
-<div class="line"><a name="l14958"></a><span class="lineno">14958</span>  suballocType,</div>
-<div class="line"><a name="l14959"></a><span class="lineno">14959</span>  allocationCount,</div>
-<div class="line"><a name="l14960"></a><span class="lineno">14960</span>  pAllocations);</div>
-<div class="line"><a name="l14961"></a><span class="lineno">14961</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l14962"></a><span class="lineno">14962</span>  {</div>
-<div class="line"><a name="l14963"></a><span class="lineno">14963</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l14964"></a><span class="lineno">14964</span>  }</div>
-<div class="line"><a name="l14965"></a><span class="lineno">14965</span>  </div>
-<div class="line"><a name="l14966"></a><span class="lineno">14966</span>  <span class="comment">// 5. Try dedicated memory.</span></div>
-<div class="line"><a name="l14967"></a><span class="lineno">14967</span>  <span class="keywordflow">if</span>((finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l14873"></a><span class="lineno">14873</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l14874"></a><span class="lineno">14874</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l14875"></a><span class="lineno">14875</span>  {</div>
+<div class="line"><a name="l14876"></a><span class="lineno">14876</span>  VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);</div>
+<div class="line"><a name="l14877"></a><span class="lineno">14877</span>  }</div>
+<div class="line"><a name="l14878"></a><span class="lineno">14878</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l14879"></a><span class="lineno">14879</span> }</div>
+<div class="line"><a name="l14880"></a><span class="lineno">14880</span>  </div>
+<div class="line"><a name="l14881"></a><span class="lineno">14881</span> VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div>
+<div class="line"><a name="l14882"></a><span class="lineno">14882</span> {</div>
+<div class="line"><a name="l14883"></a><span class="lineno">14883</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14884"></a><span class="lineno">14884</span>  <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l14885"></a><span class="lineno">14885</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize <= VMA_SMALL_HEAP_MAX_SIZE;</div>
+<div class="line"><a name="l14886"></a><span class="lineno">14886</span>  <span class="keywordflow">return</span> VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);</div>
+<div class="line"><a name="l14887"></a><span class="lineno">14887</span> }</div>
+<div class="line"><a name="l14888"></a><span class="lineno">14888</span>  </div>
+<div class="line"><a name="l14889"></a><span class="lineno">14889</span> VkResult VmaAllocator_T::AllocateMemoryOfType(</div>
+<div class="line"><a name="l14890"></a><span class="lineno">14890</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l14891"></a><span class="lineno">14891</span>  VkDeviceSize alignment,</div>
+<div class="line"><a name="l14892"></a><span class="lineno">14892</span>  <span class="keywordtype">bool</span> dedicatedAllocation,</div>
+<div class="line"><a name="l14893"></a><span class="lineno">14893</span>  VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l14894"></a><span class="lineno">14894</span>  VkImage dedicatedImage,</div>
+<div class="line"><a name="l14895"></a><span class="lineno">14895</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l14896"></a><span class="lineno">14896</span>  uint32_t memTypeIndex,</div>
+<div class="line"><a name="l14897"></a><span class="lineno">14897</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l14898"></a><span class="lineno">14898</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l14899"></a><span class="lineno">14899</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14900"></a><span class="lineno">14900</span> {</div>
+<div class="line"><a name="l14901"></a><span class="lineno">14901</span>  VMA_ASSERT(pAllocations != VMA_NULL);</div>
+<div class="line"><a name="l14902"></a><span class="lineno">14902</span>  VMA_DEBUG_LOG(<span class="stringliteral">" AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu"</span>, memTypeIndex, allocationCount, size);</div>
+<div class="line"><a name="l14903"></a><span class="lineno">14903</span>  </div>
+<div class="line"><a name="l14904"></a><span class="lineno">14904</span>  <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div>
+<div class="line"><a name="l14905"></a><span class="lineno">14905</span>  </div>
+<div class="line"><a name="l14906"></a><span class="lineno">14906</span>  <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l14907"></a><span class="lineno">14907</span>  <span class="keywordflow">if</span>((finalCreateInfo.<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>) != 0 &&</div>
+<div class="line"><a name="l14908"></a><span class="lineno">14908</span>  (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l14909"></a><span class="lineno">14909</span>  {</div>
+<div class="line"><a name="l14910"></a><span class="lineno">14910</span>  finalCreateInfo.<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"><a name="l14911"></a><span class="lineno">14911</span>  }</div>
+<div class="line"><a name="l14912"></a><span class="lineno">14912</span>  <span class="comment">// If memory is lazily allocated, it should be always dedicated.</span></div>
+<div class="line"><a name="l14913"></a><span class="lineno">14913</span>  <span class="keywordflow">if</span>(finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> == <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>)</div>
+<div class="line"><a name="l14914"></a><span class="lineno">14914</span>  {</div>
+<div class="line"><a name="l14915"></a><span class="lineno">14915</span>  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="l14916"></a><span class="lineno">14916</span>  }</div>
+<div class="line"><a name="l14917"></a><span class="lineno">14917</span>  </div>
+<div class="line"><a name="l14918"></a><span class="lineno">14918</span>  VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l14919"></a><span class="lineno">14919</span>  VMA_ASSERT(blockVector);</div>
+<div class="line"><a name="l14920"></a><span class="lineno">14920</span>  </div>
+<div class="line"><a name="l14921"></a><span class="lineno">14921</span>  <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector->GetPreferredBlockSize();</div>
+<div class="line"><a name="l14922"></a><span class="lineno">14922</span>  <span class="keywordtype">bool</span> preferDedicatedMemory =</div>
+<div class="line"><a name="l14923"></a><span class="lineno">14923</span>  VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div>
+<div class="line"><a name="l14924"></a><span class="lineno">14924</span>  dedicatedAllocation ||</div>
+<div class="line"><a name="l14925"></a><span class="lineno">14925</span>  <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="l14926"></a><span class="lineno">14926</span>  size > preferredBlockSize / 2;</div>
+<div class="line"><a name="l14927"></a><span class="lineno">14927</span>  </div>
+<div class="line"><a name="l14928"></a><span class="lineno">14928</span>  <span class="keywordflow">if</span>(preferDedicatedMemory &&</div>
+<div class="line"><a name="l14929"></a><span class="lineno">14929</span>  (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &&</div>
+<div class="line"><a name="l14930"></a><span class="lineno">14930</span>  finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l14931"></a><span class="lineno">14931</span>  {</div>
+<div class="line"><a name="l14932"></a><span class="lineno">14932</span>  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="l14933"></a><span class="lineno">14933</span>  }</div>
+<div class="line"><a name="l14934"></a><span class="lineno">14934</span>  </div>
+<div class="line"><a name="l14935"></a><span class="lineno">14935</span>  <span class="keywordflow">if</span>((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>) != 0)</div>
+<div class="line"><a name="l14936"></a><span class="lineno">14936</span>  {</div>
+<div class="line"><a name="l14937"></a><span class="lineno">14937</span>  <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l14938"></a><span class="lineno">14938</span>  {</div>
+<div class="line"><a name="l14939"></a><span class="lineno">14939</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14940"></a><span class="lineno">14940</span>  }</div>
+<div class="line"><a name="l14941"></a><span class="lineno">14941</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14942"></a><span class="lineno">14942</span>  {</div>
+<div class="line"><a name="l14943"></a><span class="lineno">14943</span>  <span class="keywordflow">return</span> AllocateDedicatedMemory(</div>
+<div class="line"><a name="l14944"></a><span class="lineno">14944</span>  size,</div>
+<div class="line"><a name="l14945"></a><span class="lineno">14945</span>  suballocType,</div>
+<div class="line"><a name="l14946"></a><span class="lineno">14946</span>  memTypeIndex,</div>
+<div class="line"><a name="l14947"></a><span class="lineno">14947</span>  (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l14948"></a><span class="lineno">14948</span>  (finalCreateInfo.<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>) != 0,</div>
+<div class="line"><a name="l14949"></a><span class="lineno">14949</span>  (finalCreateInfo.<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>) != 0,</div>
+<div class="line"><a name="l14950"></a><span class="lineno">14950</span>  finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l14951"></a><span class="lineno">14951</span>  dedicatedBuffer,</div>
+<div class="line"><a name="l14952"></a><span class="lineno">14952</span>  dedicatedImage,</div>
+<div class="line"><a name="l14953"></a><span class="lineno">14953</span>  allocationCount,</div>
+<div class="line"><a name="l14954"></a><span class="lineno">14954</span>  pAllocations);</div>
+<div class="line"><a name="l14955"></a><span class="lineno">14955</span>  }</div>
+<div class="line"><a name="l14956"></a><span class="lineno">14956</span>  }</div>
+<div class="line"><a name="l14957"></a><span class="lineno">14957</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14958"></a><span class="lineno">14958</span>  {</div>
+<div class="line"><a name="l14959"></a><span class="lineno">14959</span>  VkResult res = blockVector->Allocate(</div>
+<div class="line"><a name="l14960"></a><span class="lineno">14960</span>  m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l14961"></a><span class="lineno">14961</span>  size,</div>
+<div class="line"><a name="l14962"></a><span class="lineno">14962</span>  alignment,</div>
+<div class="line"><a name="l14963"></a><span class="lineno">14963</span>  finalCreateInfo,</div>
+<div class="line"><a name="l14964"></a><span class="lineno">14964</span>  suballocType,</div>
+<div class="line"><a name="l14965"></a><span class="lineno">14965</span>  allocationCount,</div>
+<div class="line"><a name="l14966"></a><span class="lineno">14966</span>  pAllocations);</div>
+<div class="line"><a name="l14967"></a><span class="lineno">14967</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
<div class="line"><a name="l14968"></a><span class="lineno">14968</span>  {</div>
-<div class="line"><a name="l14969"></a><span class="lineno">14969</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14969"></a><span class="lineno">14969</span>  <span class="keywordflow">return</span> res;</div>
<div class="line"><a name="l14970"></a><span class="lineno">14970</span>  }</div>
-<div class="line"><a name="l14971"></a><span class="lineno">14971</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14972"></a><span class="lineno">14972</span>  {</div>
-<div class="line"><a name="l14973"></a><span class="lineno">14973</span>  res = AllocateDedicatedMemory(</div>
-<div class="line"><a name="l14974"></a><span class="lineno">14974</span>  size,</div>
-<div class="line"><a name="l14975"></a><span class="lineno">14975</span>  suballocType,</div>
-<div class="line"><a name="l14976"></a><span class="lineno">14976</span>  memTypeIndex,</div>
-<div class="line"><a name="l14977"></a><span class="lineno">14977</span>  (finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
-<div class="line"><a name="l14978"></a><span class="lineno">14978</span>  (finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
-<div class="line"><a name="l14979"></a><span class="lineno">14979</span>  (finalCreateInfo.flags & <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="l14980"></a><span class="lineno">14980</span>  finalCreateInfo.pUserData,</div>
-<div class="line"><a name="l14981"></a><span class="lineno">14981</span>  dedicatedBuffer,</div>
-<div class="line"><a name="l14982"></a><span class="lineno">14982</span>  dedicatedImage,</div>
-<div class="line"><a name="l14983"></a><span class="lineno">14983</span>  allocationCount,</div>
-<div class="line"><a name="l14984"></a><span class="lineno">14984</span>  pAllocations);</div>
-<div class="line"><a name="l14985"></a><span class="lineno">14985</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l14986"></a><span class="lineno">14986</span>  {</div>
-<div class="line"><a name="l14987"></a><span class="lineno">14987</span>  <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div>
-<div class="line"><a name="l14988"></a><span class="lineno">14988</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Allocated as DedicatedMemory"</span>);</div>
-<div class="line"><a name="l14989"></a><span class="lineno">14989</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14990"></a><span class="lineno">14990</span>  }</div>
-<div class="line"><a name="l14991"></a><span class="lineno">14991</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14971"></a><span class="lineno">14971</span>  </div>
+<div class="line"><a name="l14972"></a><span class="lineno">14972</span>  <span class="comment">// 5. Try dedicated memory.</span></div>
+<div class="line"><a name="l14973"></a><span class="lineno">14973</span>  <span class="keywordflow">if</span>((finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l14974"></a><span class="lineno">14974</span>  {</div>
+<div class="line"><a name="l14975"></a><span class="lineno">14975</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l14976"></a><span class="lineno">14976</span>  }</div>
+<div class="line"><a name="l14977"></a><span class="lineno">14977</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14978"></a><span class="lineno">14978</span>  {</div>
+<div class="line"><a name="l14979"></a><span class="lineno">14979</span>  res = AllocateDedicatedMemory(</div>
+<div class="line"><a name="l14980"></a><span class="lineno">14980</span>  size,</div>
+<div class="line"><a name="l14981"></a><span class="lineno">14981</span>  suballocType,</div>
+<div class="line"><a name="l14982"></a><span class="lineno">14982</span>  memTypeIndex,</div>
+<div class="line"><a name="l14983"></a><span class="lineno">14983</span>  (finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l14984"></a><span class="lineno">14984</span>  (finalCreateInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
+<div class="line"><a name="l14985"></a><span class="lineno">14985</span>  (finalCreateInfo.flags & <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="l14986"></a><span class="lineno">14986</span>  finalCreateInfo.pUserData,</div>
+<div class="line"><a name="l14987"></a><span class="lineno">14987</span>  dedicatedBuffer,</div>
+<div class="line"><a name="l14988"></a><span class="lineno">14988</span>  dedicatedImage,</div>
+<div class="line"><a name="l14989"></a><span class="lineno">14989</span>  allocationCount,</div>
+<div class="line"><a name="l14990"></a><span class="lineno">14990</span>  pAllocations);</div>
+<div class="line"><a name="l14991"></a><span class="lineno">14991</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
<div class="line"><a name="l14992"></a><span class="lineno">14992</span>  {</div>
-<div class="line"><a name="l14993"></a><span class="lineno">14993</span>  <span class="comment">// Everything failed: Return error code.</span></div>
-<div class="line"><a name="l14994"></a><span class="lineno">14994</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkAllocateMemory FAILED"</span>);</div>
-<div class="line"><a name="l14995"></a><span class="lineno">14995</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14993"></a><span class="lineno">14993</span>  <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div>
+<div class="line"><a name="l14994"></a><span class="lineno">14994</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Allocated as DedicatedMemory"</span>);</div>
+<div class="line"><a name="l14995"></a><span class="lineno">14995</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
<div class="line"><a name="l14996"></a><span class="lineno">14996</span>  }</div>
-<div class="line"><a name="l14997"></a><span class="lineno">14997</span>  }</div>
-<div class="line"><a name="l14998"></a><span class="lineno">14998</span>  }</div>
-<div class="line"><a name="l14999"></a><span class="lineno">14999</span> }</div>
-<div class="line"><a name="l15000"></a><span class="lineno">15000</span>  </div>
-<div class="line"><a name="l15001"></a><span class="lineno">15001</span> VkResult VmaAllocator_T::AllocateDedicatedMemory(</div>
-<div class="line"><a name="l15002"></a><span class="lineno">15002</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l15003"></a><span class="lineno">15003</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l15004"></a><span class="lineno">15004</span>  uint32_t memTypeIndex,</div>
-<div class="line"><a name="l15005"></a><span class="lineno">15005</span>  <span class="keywordtype">bool</span> withinBudget,</div>
-<div class="line"><a name="l15006"></a><span class="lineno">15006</span>  <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l15007"></a><span class="lineno">15007</span>  <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l15008"></a><span class="lineno">15008</span>  <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l15009"></a><span class="lineno">15009</span>  VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l15010"></a><span class="lineno">15010</span>  VkImage dedicatedImage,</div>
-<div class="line"><a name="l15011"></a><span class="lineno">15011</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l15012"></a><span class="lineno">15012</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l15013"></a><span class="lineno">15013</span> {</div>
-<div class="line"><a name="l15014"></a><span class="lineno">15014</span>  VMA_ASSERT(allocationCount > 0 && pAllocations);</div>
-<div class="line"><a name="l15015"></a><span class="lineno">15015</span>  </div>
-<div class="line"><a name="l15016"></a><span class="lineno">15016</span>  <span class="keywordflow">if</span>(withinBudget)</div>
-<div class="line"><a name="l15017"></a><span class="lineno">15017</span>  {</div>
-<div class="line"><a name="l15018"></a><span class="lineno">15018</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l15019"></a><span class="lineno">15019</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l15020"></a><span class="lineno">15020</span>  GetBudget(&heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l15021"></a><span class="lineno">15021</span>  <span class="keywordflow">if</span>(heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> + size * allocationCount > heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>)</div>
-<div class="line"><a name="l15022"></a><span class="lineno">15022</span>  {</div>
-<div class="line"><a name="l15023"></a><span class="lineno">15023</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15024"></a><span class="lineno">15024</span>  }</div>
-<div class="line"><a name="l15025"></a><span class="lineno">15025</span>  }</div>
-<div class="line"><a name="l15026"></a><span class="lineno">15026</span>  </div>
-<div class="line"><a name="l15027"></a><span class="lineno">15027</span>  VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
-<div class="line"><a name="l15028"></a><span class="lineno">15028</span>  allocInfo.memoryTypeIndex = memTypeIndex;</div>
-<div class="line"><a name="l15029"></a><span class="lineno">15029</span>  allocInfo.allocationSize = size;</div>
-<div class="line"><a name="l15030"></a><span class="lineno">15030</span>  </div>
-<div class="line"><a name="l15031"></a><span class="lineno">15031</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15032"></a><span class="lineno">15032</span>  VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div>
-<div class="line"><a name="l15033"></a><span class="lineno">15033</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15034"></a><span class="lineno">15034</span>  {</div>
-<div class="line"><a name="l15035"></a><span class="lineno">15035</span>  <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l15036"></a><span class="lineno">15036</span>  {</div>
-<div class="line"><a name="l15037"></a><span class="lineno">15037</span>  VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div>
-<div class="line"><a name="l15038"></a><span class="lineno">15038</span>  dedicatedAllocInfo.buffer = dedicatedBuffer;</div>
-<div class="line"><a name="l15039"></a><span class="lineno">15039</span>  allocInfo.pNext = &dedicatedAllocInfo;</div>
-<div class="line"><a name="l15040"></a><span class="lineno">15040</span>  }</div>
-<div class="line"><a name="l15041"></a><span class="lineno">15041</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l14997"></a><span class="lineno">14997</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14998"></a><span class="lineno">14998</span>  {</div>
+<div class="line"><a name="l14999"></a><span class="lineno">14999</span>  <span class="comment">// Everything failed: Return error code.</span></div>
+<div class="line"><a name="l15000"></a><span class="lineno">15000</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkAllocateMemory FAILED"</span>);</div>
+<div class="line"><a name="l15001"></a><span class="lineno">15001</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15002"></a><span class="lineno">15002</span>  }</div>
+<div class="line"><a name="l15003"></a><span class="lineno">15003</span>  }</div>
+<div class="line"><a name="l15004"></a><span class="lineno">15004</span>  }</div>
+<div class="line"><a name="l15005"></a><span class="lineno">15005</span> }</div>
+<div class="line"><a name="l15006"></a><span class="lineno">15006</span>  </div>
+<div class="line"><a name="l15007"></a><span class="lineno">15007</span> VkResult VmaAllocator_T::AllocateDedicatedMemory(</div>
+<div class="line"><a name="l15008"></a><span class="lineno">15008</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l15009"></a><span class="lineno">15009</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l15010"></a><span class="lineno">15010</span>  uint32_t memTypeIndex,</div>
+<div class="line"><a name="l15011"></a><span class="lineno">15011</span>  <span class="keywordtype">bool</span> withinBudget,</div>
+<div class="line"><a name="l15012"></a><span class="lineno">15012</span>  <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l15013"></a><span class="lineno">15013</span>  <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l15014"></a><span class="lineno">15014</span>  <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l15015"></a><span class="lineno">15015</span>  VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l15016"></a><span class="lineno">15016</span>  VkImage dedicatedImage,</div>
+<div class="line"><a name="l15017"></a><span class="lineno">15017</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l15018"></a><span class="lineno">15018</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15019"></a><span class="lineno">15019</span> {</div>
+<div class="line"><a name="l15020"></a><span class="lineno">15020</span>  VMA_ASSERT(allocationCount > 0 && pAllocations);</div>
+<div class="line"><a name="l15021"></a><span class="lineno">15021</span>  </div>
+<div class="line"><a name="l15022"></a><span class="lineno">15022</span>  <span class="keywordflow">if</span>(withinBudget)</div>
+<div class="line"><a name="l15023"></a><span class="lineno">15023</span>  {</div>
+<div class="line"><a name="l15024"></a><span class="lineno">15024</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l15025"></a><span class="lineno">15025</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l15026"></a><span class="lineno">15026</span>  GetBudget(&heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l15027"></a><span class="lineno">15027</span>  <span class="keywordflow">if</span>(heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> + size * allocationCount > heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>)</div>
+<div class="line"><a name="l15028"></a><span class="lineno">15028</span>  {</div>
+<div class="line"><a name="l15029"></a><span class="lineno">15029</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15030"></a><span class="lineno">15030</span>  }</div>
+<div class="line"><a name="l15031"></a><span class="lineno">15031</span>  }</div>
+<div class="line"><a name="l15032"></a><span class="lineno">15032</span>  </div>
+<div class="line"><a name="l15033"></a><span class="lineno">15033</span>  VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l15034"></a><span class="lineno">15034</span>  allocInfo.memoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l15035"></a><span class="lineno">15035</span>  allocInfo.allocationSize = size;</div>
+<div class="line"><a name="l15036"></a><span class="lineno">15036</span>  </div>
+<div class="line"><a name="l15037"></a><span class="lineno">15037</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15038"></a><span class="lineno">15038</span>  VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div>
+<div class="line"><a name="l15039"></a><span class="lineno">15039</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l15040"></a><span class="lineno">15040</span>  {</div>
+<div class="line"><a name="l15041"></a><span class="lineno">15041</span>  <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
<div class="line"><a name="l15042"></a><span class="lineno">15042</span>  {</div>
-<div class="line"><a name="l15043"></a><span class="lineno">15043</span>  dedicatedAllocInfo.image = dedicatedImage;</div>
-<div class="line"><a name="l15044"></a><span class="lineno">15044</span>  allocInfo.pNext = &dedicatedAllocInfo;</div>
-<div class="line"><a name="l15045"></a><span class="lineno">15045</span>  }</div>
-<div class="line"><a name="l15046"></a><span class="lineno">15046</span>  }</div>
-<div class="line"><a name="l15047"></a><span class="lineno">15047</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15048"></a><span class="lineno">15048</span>  </div>
-<div class="line"><a name="l15049"></a><span class="lineno">15049</span>  <span class="keywordtype">size_t</span> allocIndex;</div>
-<div class="line"><a name="l15050"></a><span class="lineno">15050</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l15051"></a><span class="lineno">15051</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l15052"></a><span class="lineno">15052</span>  {</div>
-<div class="line"><a name="l15053"></a><span class="lineno">15053</span>  res = AllocateDedicatedMemoryPage(</div>
-<div class="line"><a name="l15054"></a><span class="lineno">15054</span>  size,</div>
-<div class="line"><a name="l15055"></a><span class="lineno">15055</span>  suballocType,</div>
-<div class="line"><a name="l15056"></a><span class="lineno">15056</span>  memTypeIndex,</div>
-<div class="line"><a name="l15057"></a><span class="lineno">15057</span>  allocInfo,</div>
-<div class="line"><a name="l15058"></a><span class="lineno">15058</span>  map,</div>
-<div class="line"><a name="l15059"></a><span class="lineno">15059</span>  isUserDataString,</div>
-<div class="line"><a name="l15060"></a><span class="lineno">15060</span>  pUserData,</div>
-<div class="line"><a name="l15061"></a><span class="lineno">15061</span>  pAllocations + allocIndex);</div>
-<div class="line"><a name="l15062"></a><span class="lineno">15062</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l15063"></a><span class="lineno">15063</span>  {</div>
-<div class="line"><a name="l15064"></a><span class="lineno">15064</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15065"></a><span class="lineno">15065</span>  }</div>
-<div class="line"><a name="l15066"></a><span class="lineno">15066</span>  }</div>
-<div class="line"><a name="l15067"></a><span class="lineno">15067</span>  </div>
-<div class="line"><a name="l15068"></a><span class="lineno">15068</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15069"></a><span class="lineno">15069</span>  {</div>
-<div class="line"><a name="l15070"></a><span class="lineno">15070</span>  <span class="comment">// Register them in m_pDedicatedAllocations.</span></div>
-<div class="line"><a name="l15071"></a><span class="lineno">15071</span>  {</div>
-<div class="line"><a name="l15072"></a><span class="lineno">15072</span>  VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l15073"></a><span class="lineno">15073</span>  AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l15074"></a><span class="lineno">15074</span>  VMA_ASSERT(pDedicatedAllocations);</div>
-<div class="line"><a name="l15075"></a><span class="lineno">15075</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l15076"></a><span class="lineno">15076</span>  {</div>
-<div class="line"><a name="l15077"></a><span class="lineno">15077</span>  VmaVectorInsertSorted<VmaPointerLess>(*pDedicatedAllocations, pAllocations[allocIndex]);</div>
-<div class="line"><a name="l15078"></a><span class="lineno">15078</span>  }</div>
-<div class="line"><a name="l15079"></a><span class="lineno">15079</span>  }</div>
-<div class="line"><a name="l15080"></a><span class="lineno">15080</span>  </div>
-<div class="line"><a name="l15081"></a><span class="lineno">15081</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u"</span>, allocationCount, memTypeIndex);</div>
-<div class="line"><a name="l15082"></a><span class="lineno">15082</span>  }</div>
-<div class="line"><a name="l15083"></a><span class="lineno">15083</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15084"></a><span class="lineno">15084</span>  {</div>
-<div class="line"><a name="l15085"></a><span class="lineno">15085</span>  <span class="comment">// Free all already created allocations.</span></div>
-<div class="line"><a name="l15086"></a><span class="lineno">15086</span>  <span class="keywordflow">while</span>(allocIndex--)</div>
-<div class="line"><a name="l15087"></a><span class="lineno">15087</span>  {</div>
-<div class="line"><a name="l15088"></a><span class="lineno">15088</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div>
-<div class="line"><a name="l15089"></a><span class="lineno">15089</span>  VkDeviceMemory hMemory = currAlloc->GetMemory();</div>
-<div class="line"><a name="l15090"></a><span class="lineno">15090</span>  </div>
-<div class="line"><a name="l15091"></a><span class="lineno">15091</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l15092"></a><span class="lineno">15092</span> <span class="comment"> There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
-<div class="line"><a name="l15093"></a><span class="lineno">15093</span> <span class="comment"> before vkFreeMemory.</span></div>
-<div class="line"><a name="l15094"></a><span class="lineno">15094</span> <span class="comment"></span> </div>
-<div class="line"><a name="l15095"></a><span class="lineno">15095</span> <span class="comment"> if(currAlloc->GetMappedData() != VMA_NULL)</span></div>
-<div class="line"><a name="l15096"></a><span class="lineno">15096</span> <span class="comment"> {</span></div>
-<div class="line"><a name="l15097"></a><span class="lineno">15097</span> <span class="comment"> (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
-<div class="line"><a name="l15098"></a><span class="lineno">15098</span> <span class="comment"> }</span></div>
-<div class="line"><a name="l15099"></a><span class="lineno">15099</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l15100"></a><span class="lineno">15100</span>  </div>
-<div class="line"><a name="l15101"></a><span class="lineno">15101</span>  FreeVulkanMemory(memTypeIndex, currAlloc->GetSize(), hMemory);</div>
-<div class="line"><a name="l15102"></a><span class="lineno">15102</span>  m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc->GetSize());</div>
-<div class="line"><a name="l15103"></a><span class="lineno">15103</span>  currAlloc->SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
-<div class="line"><a name="l15104"></a><span class="lineno">15104</span>  currAlloc->Dtor();</div>
-<div class="line"><a name="l15105"></a><span class="lineno">15105</span>  m_AllocationObjectAllocator.Free(currAlloc);</div>
-<div class="line"><a name="l15106"></a><span class="lineno">15106</span>  }</div>
-<div class="line"><a name="l15107"></a><span class="lineno">15107</span>  </div>
-<div class="line"><a name="l15108"></a><span class="lineno">15108</span>  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="l15109"></a><span class="lineno">15109</span>  }</div>
-<div class="line"><a name="l15110"></a><span class="lineno">15110</span>  </div>
-<div class="line"><a name="l15111"></a><span class="lineno">15111</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15112"></a><span class="lineno">15112</span> }</div>
+<div class="line"><a name="l15043"></a><span class="lineno">15043</span>  VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l15044"></a><span class="lineno">15044</span>  dedicatedAllocInfo.buffer = dedicatedBuffer;</div>
+<div class="line"><a name="l15045"></a><span class="lineno">15045</span>  allocInfo.pNext = &dedicatedAllocInfo;</div>
+<div class="line"><a name="l15046"></a><span class="lineno">15046</span>  }</div>
+<div class="line"><a name="l15047"></a><span class="lineno">15047</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15048"></a><span class="lineno">15048</span>  {</div>
+<div class="line"><a name="l15049"></a><span class="lineno">15049</span>  dedicatedAllocInfo.image = dedicatedImage;</div>
+<div class="line"><a name="l15050"></a><span class="lineno">15050</span>  allocInfo.pNext = &dedicatedAllocInfo;</div>
+<div class="line"><a name="l15051"></a><span class="lineno">15051</span>  }</div>
+<div class="line"><a name="l15052"></a><span class="lineno">15052</span>  }</div>
+<div class="line"><a name="l15053"></a><span class="lineno">15053</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15054"></a><span class="lineno">15054</span>  </div>
+<div class="line"><a name="l15055"></a><span class="lineno">15055</span>  <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l15056"></a><span class="lineno">15056</span>  VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l15057"></a><span class="lineno">15057</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l15058"></a><span class="lineno">15058</span>  {</div>
+<div class="line"><a name="l15059"></a><span class="lineno">15059</span>  res = AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l15060"></a><span class="lineno">15060</span>  size,</div>
+<div class="line"><a name="l15061"></a><span class="lineno">15061</span>  suballocType,</div>
+<div class="line"><a name="l15062"></a><span class="lineno">15062</span>  memTypeIndex,</div>
+<div class="line"><a name="l15063"></a><span class="lineno">15063</span>  allocInfo,</div>
+<div class="line"><a name="l15064"></a><span class="lineno">15064</span>  map,</div>
+<div class="line"><a name="l15065"></a><span class="lineno">15065</span>  isUserDataString,</div>
+<div class="line"><a name="l15066"></a><span class="lineno">15066</span>  pUserData,</div>
+<div class="line"><a name="l15067"></a><span class="lineno">15067</span>  pAllocations + allocIndex);</div>
+<div class="line"><a name="l15068"></a><span class="lineno">15068</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l15069"></a><span class="lineno">15069</span>  {</div>
+<div class="line"><a name="l15070"></a><span class="lineno">15070</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15071"></a><span class="lineno">15071</span>  }</div>
+<div class="line"><a name="l15072"></a><span class="lineno">15072</span>  }</div>
+<div class="line"><a name="l15073"></a><span class="lineno">15073</span>  </div>
+<div class="line"><a name="l15074"></a><span class="lineno">15074</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15075"></a><span class="lineno">15075</span>  {</div>
+<div class="line"><a name="l15076"></a><span class="lineno">15076</span>  <span class="comment">// Register them in m_pDedicatedAllocations.</span></div>
+<div class="line"><a name="l15077"></a><span class="lineno">15077</span>  {</div>
+<div class="line"><a name="l15078"></a><span class="lineno">15078</span>  VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l15079"></a><span class="lineno">15079</span>  AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l15080"></a><span class="lineno">15080</span>  VMA_ASSERT(pDedicatedAllocations);</div>
+<div class="line"><a name="l15081"></a><span class="lineno">15081</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l15082"></a><span class="lineno">15082</span>  {</div>
+<div class="line"><a name="l15083"></a><span class="lineno">15083</span>  VmaVectorInsertSorted<VmaPointerLess>(*pDedicatedAllocations, pAllocations[allocIndex]);</div>
+<div class="line"><a name="l15084"></a><span class="lineno">15084</span>  }</div>
+<div class="line"><a name="l15085"></a><span class="lineno">15085</span>  }</div>
+<div class="line"><a name="l15086"></a><span class="lineno">15086</span>  </div>
+<div class="line"><a name="l15087"></a><span class="lineno">15087</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u"</span>, allocationCount, memTypeIndex);</div>
+<div class="line"><a name="l15088"></a><span class="lineno">15088</span>  }</div>
+<div class="line"><a name="l15089"></a><span class="lineno">15089</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15090"></a><span class="lineno">15090</span>  {</div>
+<div class="line"><a name="l15091"></a><span class="lineno">15091</span>  <span class="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l15092"></a><span class="lineno">15092</span>  <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l15093"></a><span class="lineno">15093</span>  {</div>
+<div class="line"><a name="l15094"></a><span class="lineno">15094</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l15095"></a><span class="lineno">15095</span>  VkDeviceMemory hMemory = currAlloc->GetMemory();</div>
+<div class="line"><a name="l15096"></a><span class="lineno">15096</span>  </div>
+<div class="line"><a name="l15097"></a><span class="lineno">15097</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l15098"></a><span class="lineno">15098</span> <span class="comment"> There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
+<div class="line"><a name="l15099"></a><span class="lineno">15099</span> <span class="comment"> before vkFreeMemory.</span></div>
+<div class="line"><a name="l15100"></a><span class="lineno">15100</span> <span class="comment"></span> </div>
+<div class="line"><a name="l15101"></a><span class="lineno">15101</span> <span class="comment"> if(currAlloc->GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l15102"></a><span class="lineno">15102</span> <span class="comment"> {</span></div>
+<div class="line"><a name="l15103"></a><span class="lineno">15103</span> <span class="comment"> (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l15104"></a><span class="lineno">15104</span> <span class="comment"> }</span></div>
+<div class="line"><a name="l15105"></a><span class="lineno">15105</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l15106"></a><span class="lineno">15106</span>  </div>
+<div class="line"><a name="l15107"></a><span class="lineno">15107</span>  FreeVulkanMemory(memTypeIndex, currAlloc->GetSize(), hMemory);</div>
+<div class="line"><a name="l15108"></a><span class="lineno">15108</span>  m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc->GetSize());</div>
+<div class="line"><a name="l15109"></a><span class="lineno">15109</span>  currAlloc->SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l15110"></a><span class="lineno">15110</span>  currAlloc->Dtor();</div>
+<div class="line"><a name="l15111"></a><span class="lineno">15111</span>  m_AllocationObjectAllocator.Free(currAlloc);</div>
+<div class="line"><a name="l15112"></a><span class="lineno">15112</span>  }</div>
<div class="line"><a name="l15113"></a><span class="lineno">15113</span>  </div>
-<div class="line"><a name="l15114"></a><span class="lineno">15114</span> VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div>
-<div class="line"><a name="l15115"></a><span class="lineno">15115</span>  VkDeviceSize size,</div>
-<div class="line"><a name="l15116"></a><span class="lineno">15116</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l15117"></a><span class="lineno">15117</span>  uint32_t memTypeIndex,</div>
-<div class="line"><a name="l15118"></a><span class="lineno">15118</span>  <span class="keyword">const</span> VkMemoryAllocateInfo& allocInfo,</div>
-<div class="line"><a name="l15119"></a><span class="lineno">15119</span>  <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l15120"></a><span class="lineno">15120</span>  <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l15121"></a><span class="lineno">15121</span>  <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l15122"></a><span class="lineno">15122</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l15123"></a><span class="lineno">15123</span> {</div>
-<div class="line"><a name="l15124"></a><span class="lineno">15124</span>  VkDeviceMemory hMemory = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l15125"></a><span class="lineno">15125</span>  VkResult res = AllocateVulkanMemory(&allocInfo, &hMemory);</div>
-<div class="line"><a name="l15126"></a><span class="lineno">15126</span>  <span class="keywordflow">if</span>(res < 0)</div>
-<div class="line"><a name="l15127"></a><span class="lineno">15127</span>  {</div>
-<div class="line"><a name="l15128"></a><span class="lineno">15128</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkAllocateMemory FAILED"</span>);</div>
-<div class="line"><a name="l15129"></a><span class="lineno">15129</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15130"></a><span class="lineno">15130</span>  }</div>
-<div class="line"><a name="l15131"></a><span class="lineno">15131</span>  </div>
-<div class="line"><a name="l15132"></a><span class="lineno">15132</span>  <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div>
-<div class="line"><a name="l15133"></a><span class="lineno">15133</span>  <span class="keywordflow">if</span>(map)</div>
-<div class="line"><a name="l15134"></a><span class="lineno">15134</span>  {</div>
-<div class="line"><a name="l15135"></a><span class="lineno">15135</span>  res = (*m_VulkanFunctions.vkMapMemory)(</div>
-<div class="line"><a name="l15136"></a><span class="lineno">15136</span>  m_hDevice,</div>
-<div class="line"><a name="l15137"></a><span class="lineno">15137</span>  hMemory,</div>
-<div class="line"><a name="l15138"></a><span class="lineno">15138</span>  0,</div>
-<div class="line"><a name="l15139"></a><span class="lineno">15139</span>  VK_WHOLE_SIZE,</div>
-<div class="line"><a name="l15140"></a><span class="lineno">15140</span>  0,</div>
-<div class="line"><a name="l15141"></a><span class="lineno">15141</span>  &pMappedData);</div>
-<div class="line"><a name="l15142"></a><span class="lineno">15142</span>  <span class="keywordflow">if</span>(res < 0)</div>
-<div class="line"><a name="l15143"></a><span class="lineno">15143</span>  {</div>
-<div class="line"><a name="l15144"></a><span class="lineno">15144</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkMapMemory FAILED"</span>);</div>
-<div class="line"><a name="l15145"></a><span class="lineno">15145</span>  FreeVulkanMemory(memTypeIndex, size, hMemory);</div>
-<div class="line"><a name="l15146"></a><span class="lineno">15146</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15147"></a><span class="lineno">15147</span>  }</div>
-<div class="line"><a name="l15148"></a><span class="lineno">15148</span>  }</div>
-<div class="line"><a name="l15149"></a><span class="lineno">15149</span>  </div>
-<div class="line"><a name="l15150"></a><span class="lineno">15150</span>  *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
-<div class="line"><a name="l15151"></a><span class="lineno">15151</span>  (*pAllocation)->Ctor(m_CurrentFrameIndex.load(), isUserDataString);</div>
-<div class="line"><a name="l15152"></a><span class="lineno">15152</span>  (*pAllocation)->InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div>
-<div class="line"><a name="l15153"></a><span class="lineno">15153</span>  (*pAllocation)->SetUserData(<span class="keyword">this</span>, pUserData);</div>
-<div class="line"><a name="l15154"></a><span class="lineno">15154</span>  m_Budget.AddAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), size);</div>
-<div class="line"><a name="l15155"></a><span class="lineno">15155</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l15156"></a><span class="lineno">15156</span>  {</div>
-<div class="line"><a name="l15157"></a><span class="lineno">15157</span>  FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l15158"></a><span class="lineno">15158</span>  }</div>
-<div class="line"><a name="l15159"></a><span class="lineno">15159</span>  </div>
-<div class="line"><a name="l15160"></a><span class="lineno">15160</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l15161"></a><span class="lineno">15161</span> }</div>
-<div class="line"><a name="l15162"></a><span class="lineno">15162</span>  </div>
-<div class="line"><a name="l15163"></a><span class="lineno">15163</span> <span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div>
-<div class="line"><a name="l15164"></a><span class="lineno">15164</span>  VkBuffer hBuffer,</div>
-<div class="line"><a name="l15165"></a><span class="lineno">15165</span>  VkMemoryRequirements& memReq,</div>
-<div class="line"><a name="l15166"></a><span class="lineno">15166</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div>
-<div class="line"><a name="l15167"></a><span class="lineno">15167</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation)<span class="keyword"> const</span></div>
-<div class="line"><a name="l15168"></a><span class="lineno">15168</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l15169"></a><span class="lineno">15169</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15170"></a><span class="lineno">15170</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15171"></a><span class="lineno">15171</span>  {</div>
-<div class="line"><a name="l15172"></a><span class="lineno">15172</span>  VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
-<div class="line"><a name="l15173"></a><span class="lineno">15173</span>  memReqInfo.buffer = hBuffer;</div>
-<div class="line"><a name="l15174"></a><span class="lineno">15174</span>  </div>
-<div class="line"><a name="l15175"></a><span class="lineno">15175</span>  VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
-<div class="line"><a name="l15176"></a><span class="lineno">15176</span>  </div>
-<div class="line"><a name="l15177"></a><span class="lineno">15177</span>  VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
-<div class="line"><a name="l15178"></a><span class="lineno">15178</span>  memReq2.pNext = &memDedicatedReq;</div>
-<div class="line"><a name="l15179"></a><span class="lineno">15179</span>  </div>
-<div class="line"><a name="l15180"></a><span class="lineno">15180</span>  (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);</div>
-<div class="line"><a name="l15181"></a><span class="lineno">15181</span>  </div>
-<div class="line"><a name="l15182"></a><span class="lineno">15182</span>  memReq = memReq2.memoryRequirements;</div>
-<div class="line"><a name="l15183"></a><span class="lineno">15183</span>  requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l15184"></a><span class="lineno">15184</span>  prefersDedicatedAllocation = (memDedicatedReq.prefersDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l15185"></a><span class="lineno">15185</span>  }</div>
-<div class="line"><a name="l15186"></a><span class="lineno">15186</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15187"></a><span class="lineno">15187</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15188"></a><span class="lineno">15188</span>  {</div>
-<div class="line"><a name="l15189"></a><span class="lineno">15189</span>  (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &memReq);</div>
-<div class="line"><a name="l15190"></a><span class="lineno">15190</span>  requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15191"></a><span class="lineno">15191</span>  prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15192"></a><span class="lineno">15192</span>  }</div>
-<div class="line"><a name="l15193"></a><span class="lineno">15193</span> }</div>
-<div class="line"><a name="l15194"></a><span class="lineno">15194</span>  </div>
-<div class="line"><a name="l15195"></a><span class="lineno">15195</span> <span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div>
-<div class="line"><a name="l15196"></a><span class="lineno">15196</span>  VkImage hImage,</div>
-<div class="line"><a name="l15197"></a><span class="lineno">15197</span>  VkMemoryRequirements& memReq,</div>
-<div class="line"><a name="l15198"></a><span class="lineno">15198</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div>
-<div class="line"><a name="l15199"></a><span class="lineno">15199</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation)<span class="keyword"> const</span></div>
-<div class="line"><a name="l15200"></a><span class="lineno">15200</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l15201"></a><span class="lineno">15201</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15202"></a><span class="lineno">15202</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15203"></a><span class="lineno">15203</span>  {</div>
-<div class="line"><a name="l15204"></a><span class="lineno">15204</span>  VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
-<div class="line"><a name="l15205"></a><span class="lineno">15205</span>  memReqInfo.image = hImage;</div>
-<div class="line"><a name="l15206"></a><span class="lineno">15206</span>  </div>
-<div class="line"><a name="l15207"></a><span class="lineno">15207</span>  VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
-<div class="line"><a name="l15208"></a><span class="lineno">15208</span>  </div>
-<div class="line"><a name="l15209"></a><span class="lineno">15209</span>  VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
-<div class="line"><a name="l15210"></a><span class="lineno">15210</span>  memReq2.pNext = &memDedicatedReq;</div>
-<div class="line"><a name="l15211"></a><span class="lineno">15211</span>  </div>
-<div class="line"><a name="l15212"></a><span class="lineno">15212</span>  (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);</div>
-<div class="line"><a name="l15213"></a><span class="lineno">15213</span>  </div>
-<div class="line"><a name="l15214"></a><span class="lineno">15214</span>  memReq = memReq2.memoryRequirements;</div>
-<div class="line"><a name="l15215"></a><span class="lineno">15215</span>  requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l15216"></a><span class="lineno">15216</span>  prefersDedicatedAllocation = (memDedicatedReq.prefersDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l15217"></a><span class="lineno">15217</span>  }</div>
-<div class="line"><a name="l15218"></a><span class="lineno">15218</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15219"></a><span class="lineno">15219</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
-<div class="line"><a name="l15220"></a><span class="lineno">15220</span>  {</div>
-<div class="line"><a name="l15221"></a><span class="lineno">15221</span>  (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &memReq);</div>
-<div class="line"><a name="l15222"></a><span class="lineno">15222</span>  requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15223"></a><span class="lineno">15223</span>  prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15224"></a><span class="lineno">15224</span>  }</div>
-<div class="line"><a name="l15225"></a><span class="lineno">15225</span> }</div>
-<div class="line"><a name="l15226"></a><span class="lineno">15226</span>  </div>
-<div class="line"><a name="l15227"></a><span class="lineno">15227</span> VkResult VmaAllocator_T::AllocateMemory(</div>
-<div class="line"><a name="l15228"></a><span class="lineno">15228</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
-<div class="line"><a name="l15229"></a><span class="lineno">15229</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l15230"></a><span class="lineno">15230</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l15231"></a><span class="lineno">15231</span>  VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l15232"></a><span class="lineno">15232</span>  VkImage dedicatedImage,</div>
-<div class="line"><a name="l15233"></a><span class="lineno">15233</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
-<div class="line"><a name="l15234"></a><span class="lineno">15234</span>  VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l15235"></a><span class="lineno">15235</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l15236"></a><span class="lineno">15236</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l15237"></a><span class="lineno">15237</span> {</div>
-<div class="line"><a name="l15238"></a><span class="lineno">15238</span>  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="l15239"></a><span class="lineno">15239</span>  </div>
-<div class="line"><a name="l15240"></a><span class="lineno">15240</span>  VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div>
-<div class="line"><a name="l15241"></a><span class="lineno">15241</span>  </div>
-<div class="line"><a name="l15242"></a><span class="lineno">15242</span>  <span class="keywordflow">if</span>(vkMemReq.size == 0)</div>
-<div class="line"><a name="l15243"></a><span class="lineno">15243</span>  {</div>
-<div class="line"><a name="l15244"></a><span class="lineno">15244</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l15245"></a><span class="lineno">15245</span>  }</div>
-<div class="line"><a name="l15246"></a><span class="lineno">15246</span>  <span class="keywordflow">if</span>((createInfo.<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>) != 0 &&</div>
-<div class="line"><a name="l15247"></a><span class="lineno">15247</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l15248"></a><span class="lineno">15248</span>  {</div>
-<div class="line"><a name="l15249"></a><span class="lineno">15249</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense."</span>);</div>
-<div class="line"><a name="l15250"></a><span class="lineno">15250</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15114"></a><span class="lineno">15114</span>  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="l15115"></a><span class="lineno">15115</span>  }</div>
+<div class="line"><a name="l15116"></a><span class="lineno">15116</span>  </div>
+<div class="line"><a name="l15117"></a><span class="lineno">15117</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15118"></a><span class="lineno">15118</span> }</div>
+<div class="line"><a name="l15119"></a><span class="lineno">15119</span>  </div>
+<div class="line"><a name="l15120"></a><span class="lineno">15120</span> VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l15121"></a><span class="lineno">15121</span>  VkDeviceSize size,</div>
+<div class="line"><a name="l15122"></a><span class="lineno">15122</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l15123"></a><span class="lineno">15123</span>  uint32_t memTypeIndex,</div>
+<div class="line"><a name="l15124"></a><span class="lineno">15124</span>  <span class="keyword">const</span> VkMemoryAllocateInfo& allocInfo,</div>
+<div class="line"><a name="l15125"></a><span class="lineno">15125</span>  <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l15126"></a><span class="lineno">15126</span>  <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l15127"></a><span class="lineno">15127</span>  <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l15128"></a><span class="lineno">15128</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l15129"></a><span class="lineno">15129</span> {</div>
+<div class="line"><a name="l15130"></a><span class="lineno">15130</span>  VkDeviceMemory hMemory = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l15131"></a><span class="lineno">15131</span>  VkResult res = AllocateVulkanMemory(&allocInfo, &hMemory);</div>
+<div class="line"><a name="l15132"></a><span class="lineno">15132</span>  <span class="keywordflow">if</span>(res < 0)</div>
+<div class="line"><a name="l15133"></a><span class="lineno">15133</span>  {</div>
+<div class="line"><a name="l15134"></a><span class="lineno">15134</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkAllocateMemory FAILED"</span>);</div>
+<div class="line"><a name="l15135"></a><span class="lineno">15135</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15136"></a><span class="lineno">15136</span>  }</div>
+<div class="line"><a name="l15137"></a><span class="lineno">15137</span>  </div>
+<div class="line"><a name="l15138"></a><span class="lineno">15138</span>  <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l15139"></a><span class="lineno">15139</span>  <span class="keywordflow">if</span>(map)</div>
+<div class="line"><a name="l15140"></a><span class="lineno">15140</span>  {</div>
+<div class="line"><a name="l15141"></a><span class="lineno">15141</span>  res = (*m_VulkanFunctions.vkMapMemory)(</div>
+<div class="line"><a name="l15142"></a><span class="lineno">15142</span>  m_hDevice,</div>
+<div class="line"><a name="l15143"></a><span class="lineno">15143</span>  hMemory,</div>
+<div class="line"><a name="l15144"></a><span class="lineno">15144</span>  0,</div>
+<div class="line"><a name="l15145"></a><span class="lineno">15145</span>  VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l15146"></a><span class="lineno">15146</span>  0,</div>
+<div class="line"><a name="l15147"></a><span class="lineno">15147</span>  &pMappedData);</div>
+<div class="line"><a name="l15148"></a><span class="lineno">15148</span>  <span class="keywordflow">if</span>(res < 0)</div>
+<div class="line"><a name="l15149"></a><span class="lineno">15149</span>  {</div>
+<div class="line"><a name="l15150"></a><span class="lineno">15150</span>  VMA_DEBUG_LOG(<span class="stringliteral">" vkMapMemory FAILED"</span>);</div>
+<div class="line"><a name="l15151"></a><span class="lineno">15151</span>  FreeVulkanMemory(memTypeIndex, size, hMemory);</div>
+<div class="line"><a name="l15152"></a><span class="lineno">15152</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15153"></a><span class="lineno">15153</span>  }</div>
+<div class="line"><a name="l15154"></a><span class="lineno">15154</span>  }</div>
+<div class="line"><a name="l15155"></a><span class="lineno">15155</span>  </div>
+<div class="line"><a name="l15156"></a><span class="lineno">15156</span>  *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l15157"></a><span class="lineno">15157</span>  (*pAllocation)->Ctor(m_CurrentFrameIndex.load(), isUserDataString);</div>
+<div class="line"><a name="l15158"></a><span class="lineno">15158</span>  (*pAllocation)->InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div>
+<div class="line"><a name="l15159"></a><span class="lineno">15159</span>  (*pAllocation)->SetUserData(<span class="keyword">this</span>, pUserData);</div>
+<div class="line"><a name="l15160"></a><span class="lineno">15160</span>  m_Budget.AddAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), size);</div>
+<div class="line"><a name="l15161"></a><span class="lineno">15161</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l15162"></a><span class="lineno">15162</span>  {</div>
+<div class="line"><a name="l15163"></a><span class="lineno">15163</span>  FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l15164"></a><span class="lineno">15164</span>  }</div>
+<div class="line"><a name="l15165"></a><span class="lineno">15165</span>  </div>
+<div class="line"><a name="l15166"></a><span class="lineno">15166</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15167"></a><span class="lineno">15167</span> }</div>
+<div class="line"><a name="l15168"></a><span class="lineno">15168</span>  </div>
+<div class="line"><a name="l15169"></a><span class="lineno">15169</span> <span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div>
+<div class="line"><a name="l15170"></a><span class="lineno">15170</span>  VkBuffer hBuffer,</div>
+<div class="line"><a name="l15171"></a><span class="lineno">15171</span>  VkMemoryRequirements& memReq,</div>
+<div class="line"><a name="l15172"></a><span class="lineno">15172</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15173"></a><span class="lineno">15173</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l15174"></a><span class="lineno">15174</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l15175"></a><span class="lineno">15175</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15176"></a><span class="lineno">15176</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l15177"></a><span class="lineno">15177</span>  {</div>
+<div class="line"><a name="l15178"></a><span class="lineno">15178</span>  VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l15179"></a><span class="lineno">15179</span>  memReqInfo.buffer = hBuffer;</div>
+<div class="line"><a name="l15180"></a><span class="lineno">15180</span>  </div>
+<div class="line"><a name="l15181"></a><span class="lineno">15181</span>  VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
+<div class="line"><a name="l15182"></a><span class="lineno">15182</span>  </div>
+<div class="line"><a name="l15183"></a><span class="lineno">15183</span>  VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l15184"></a><span class="lineno">15184</span>  memReq2.pNext = &memDedicatedReq;</div>
+<div class="line"><a name="l15185"></a><span class="lineno">15185</span>  </div>
+<div class="line"><a name="l15186"></a><span class="lineno">15186</span>  (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);</div>
+<div class="line"><a name="l15187"></a><span class="lineno">15187</span>  </div>
+<div class="line"><a name="l15188"></a><span class="lineno">15188</span>  memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l15189"></a><span class="lineno">15189</span>  requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l15190"></a><span class="lineno">15190</span>  prefersDedicatedAllocation = (memDedicatedReq.prefersDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l15191"></a><span class="lineno">15191</span>  }</div>
+<div class="line"><a name="l15192"></a><span class="lineno">15192</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15193"></a><span class="lineno">15193</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15194"></a><span class="lineno">15194</span>  {</div>
+<div class="line"><a name="l15195"></a><span class="lineno">15195</span>  (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &memReq);</div>
+<div class="line"><a name="l15196"></a><span class="lineno">15196</span>  requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15197"></a><span class="lineno">15197</span>  prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15198"></a><span class="lineno">15198</span>  }</div>
+<div class="line"><a name="l15199"></a><span class="lineno">15199</span> }</div>
+<div class="line"><a name="l15200"></a><span class="lineno">15200</span>  </div>
+<div class="line"><a name="l15201"></a><span class="lineno">15201</span> <span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div>
+<div class="line"><a name="l15202"></a><span class="lineno">15202</span>  VkImage hImage,</div>
+<div class="line"><a name="l15203"></a><span class="lineno">15203</span>  VkMemoryRequirements& memReq,</div>
+<div class="line"><a name="l15204"></a><span class="lineno">15204</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15205"></a><span class="lineno">15205</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l15206"></a><span class="lineno">15206</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l15207"></a><span class="lineno">15207</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15208"></a><span class="lineno">15208</span>  <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l15209"></a><span class="lineno">15209</span>  {</div>
+<div class="line"><a name="l15210"></a><span class="lineno">15210</span>  VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l15211"></a><span class="lineno">15211</span>  memReqInfo.image = hImage;</div>
+<div class="line"><a name="l15212"></a><span class="lineno">15212</span>  </div>
+<div class="line"><a name="l15213"></a><span class="lineno">15213</span>  VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
+<div class="line"><a name="l15214"></a><span class="lineno">15214</span>  </div>
+<div class="line"><a name="l15215"></a><span class="lineno">15215</span>  VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l15216"></a><span class="lineno">15216</span>  memReq2.pNext = &memDedicatedReq;</div>
+<div class="line"><a name="l15217"></a><span class="lineno">15217</span>  </div>
+<div class="line"><a name="l15218"></a><span class="lineno">15218</span>  (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &memReqInfo, &memReq2);</div>
+<div class="line"><a name="l15219"></a><span class="lineno">15219</span>  </div>
+<div class="line"><a name="l15220"></a><span class="lineno">15220</span>  memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l15221"></a><span class="lineno">15221</span>  requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l15222"></a><span class="lineno">15222</span>  prefersDedicatedAllocation = (memDedicatedReq.prefersDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l15223"></a><span class="lineno">15223</span>  }</div>
+<div class="line"><a name="l15224"></a><span class="lineno">15224</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15225"></a><span class="lineno">15225</span> <span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div>
+<div class="line"><a name="l15226"></a><span class="lineno">15226</span>  {</div>
+<div class="line"><a name="l15227"></a><span class="lineno">15227</span>  (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &memReq);</div>
+<div class="line"><a name="l15228"></a><span class="lineno">15228</span>  requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15229"></a><span class="lineno">15229</span>  prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15230"></a><span class="lineno">15230</span>  }</div>
+<div class="line"><a name="l15231"></a><span class="lineno">15231</span> }</div>
+<div class="line"><a name="l15232"></a><span class="lineno">15232</span>  </div>
+<div class="line"><a name="l15233"></a><span class="lineno">15233</span> VkResult VmaAllocator_T::AllocateMemory(</div>
+<div class="line"><a name="l15234"></a><span class="lineno">15234</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div>
+<div class="line"><a name="l15235"></a><span class="lineno">15235</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15236"></a><span class="lineno">15236</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15237"></a><span class="lineno">15237</span>  VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l15238"></a><span class="lineno">15238</span>  VkImage dedicatedImage,</div>
+<div class="line"><a name="l15239"></a><span class="lineno">15239</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>& createInfo,</div>
+<div class="line"><a name="l15240"></a><span class="lineno">15240</span>  VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l15241"></a><span class="lineno">15241</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l15242"></a><span class="lineno">15242</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15243"></a><span class="lineno">15243</span> {</div>
+<div class="line"><a name="l15244"></a><span class="lineno">15244</span>  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="l15245"></a><span class="lineno">15245</span>  </div>
+<div class="line"><a name="l15246"></a><span class="lineno">15246</span>  VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div>
+<div class="line"><a name="l15247"></a><span class="lineno">15247</span>  </div>
+<div class="line"><a name="l15248"></a><span class="lineno">15248</span>  <span class="keywordflow">if</span>(vkMemReq.size == 0)</div>
+<div class="line"><a name="l15249"></a><span class="lineno">15249</span>  {</div>
+<div class="line"><a name="l15250"></a><span class="lineno">15250</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
<div class="line"><a name="l15251"></a><span class="lineno">15251</span>  }</div>
-<div class="line"><a name="l15252"></a><span class="lineno">15252</span>  <span class="keywordflow">if</span>((createInfo.<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>) != 0 &&</div>
-<div class="line"><a name="l15253"></a><span class="lineno">15253</span>  (createInfo.<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>) != 0)</div>
+<div class="line"><a name="l15252"></a><span class="lineno">15252</span>  <span class="keywordflow">if</span>((createInfo.<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>) != 0 &&</div>
+<div class="line"><a name="l15253"></a><span class="lineno">15253</span>  (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
<div class="line"><a name="l15254"></a><span class="lineno">15254</span>  {</div>
-<div class="line"><a name="l15255"></a><span class="lineno">15255</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid."</span>);</div>
+<div class="line"><a name="l15255"></a><span class="lineno">15255</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense."</span>);</div>
<div class="line"><a name="l15256"></a><span class="lineno">15256</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
<div class="line"><a name="l15257"></a><span class="lineno">15257</span>  }</div>
-<div class="line"><a name="l15258"></a><span class="lineno">15258</span>  <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div>
-<div class="line"><a name="l15259"></a><span class="lineno">15259</span>  {</div>
-<div class="line"><a name="l15260"></a><span class="lineno">15260</span>  <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l15261"></a><span class="lineno">15261</span>  {</div>
-<div class="line"><a name="l15262"></a><span class="lineno">15262</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required."</span>);</div>
-<div class="line"><a name="l15263"></a><span class="lineno">15263</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15264"></a><span class="lineno">15264</span>  }</div>
-<div class="line"><a name="l15265"></a><span class="lineno">15265</span>  <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="l15266"></a><span class="lineno">15266</span>  {</div>
-<div class="line"><a name="l15267"></a><span class="lineno">15267</span>  VMA_ASSERT(0 && <span class="stringliteral">"Pool specified while dedicated allocation is required."</span>);</div>
-<div class="line"><a name="l15268"></a><span class="lineno">15268</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15269"></a><span class="lineno">15269</span>  }</div>
-<div class="line"><a name="l15270"></a><span class="lineno">15270</span>  }</div>
-<div class="line"><a name="l15271"></a><span class="lineno">15271</span>  <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="l15272"></a><span class="lineno">15272</span>  ((createInfo.<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>)) != 0))</div>
-<div class="line"><a name="l15273"></a><span class="lineno">15273</span>  {</div>
-<div class="line"><a name="l15274"></a><span class="lineno">15274</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid."</span>);</div>
-<div class="line"><a name="l15275"></a><span class="lineno">15275</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15258"></a><span class="lineno">15258</span>  <span class="keywordflow">if</span>((createInfo.<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>) != 0 &&</div>
+<div class="line"><a name="l15259"></a><span class="lineno">15259</span>  (createInfo.<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>) != 0)</div>
+<div class="line"><a name="l15260"></a><span class="lineno">15260</span>  {</div>
+<div class="line"><a name="l15261"></a><span class="lineno">15261</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid."</span>);</div>
+<div class="line"><a name="l15262"></a><span class="lineno">15262</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15263"></a><span class="lineno">15263</span>  }</div>
+<div class="line"><a name="l15264"></a><span class="lineno">15264</span>  <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div>
+<div class="line"><a name="l15265"></a><span class="lineno">15265</span>  {</div>
+<div class="line"><a name="l15266"></a><span class="lineno">15266</span>  <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l15267"></a><span class="lineno">15267</span>  {</div>
+<div class="line"><a name="l15268"></a><span class="lineno">15268</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required."</span>);</div>
+<div class="line"><a name="l15269"></a><span class="lineno">15269</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15270"></a><span class="lineno">15270</span>  }</div>
+<div class="line"><a name="l15271"></a><span class="lineno">15271</span>  <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="l15272"></a><span class="lineno">15272</span>  {</div>
+<div class="line"><a name="l15273"></a><span class="lineno">15273</span>  VMA_ASSERT(0 && <span class="stringliteral">"Pool specified while dedicated allocation is required."</span>);</div>
+<div class="line"><a name="l15274"></a><span class="lineno">15274</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15275"></a><span class="lineno">15275</span>  }</div>
<div class="line"><a name="l15276"></a><span class="lineno">15276</span>  }</div>
-<div class="line"><a name="l15277"></a><span class="lineno">15277</span>  </div>
-<div class="line"><a name="l15278"></a><span class="lineno">15278</span>  <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="l15277"></a><span class="lineno">15277</span>  <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="l15278"></a><span class="lineno">15278</span>  ((createInfo.<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>)) != 0))</div>
<div class="line"><a name="l15279"></a><span class="lineno">15279</span>  {</div>
-<div class="line"><a name="l15280"></a><span class="lineno">15280</span>  <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div>
-<div class="line"><a name="l15281"></a><span class="lineno">15281</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l15282"></a><span class="lineno">15282</span>  GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.GetMemoryTypeIndex()));</div>
+<div class="line"><a name="l15280"></a><span class="lineno">15280</span>  VMA_ASSERT(0 && <span class="stringliteral">"Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid."</span>);</div>
+<div class="line"><a name="l15281"></a><span class="lineno">15281</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15282"></a><span class="lineno">15282</span>  }</div>
<div class="line"><a name="l15283"></a><span class="lineno">15283</span>  </div>
-<div class="line"><a name="l15284"></a><span class="lineno">15284</span>  <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div>
-<div class="line"><a name="l15285"></a><span class="lineno">15285</span>  <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
-<div class="line"><a name="l15286"></a><span class="lineno">15286</span>  <span class="keywordflow">if</span>((createInfoForPool.<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>) != 0 &&</div>
-<div class="line"><a name="l15287"></a><span class="lineno">15287</span>  (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.GetMemoryTypeIndex()].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l15288"></a><span class="lineno">15288</span>  {</div>
-<div class="line"><a name="l15289"></a><span class="lineno">15289</span>  createInfoForPool.<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"><a name="l15290"></a><span class="lineno">15290</span>  }</div>
-<div class="line"><a name="l15291"></a><span class="lineno">15291</span>  </div>
-<div class="line"><a name="l15292"></a><span class="lineno">15292</span>  <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.Allocate(</div>
-<div class="line"><a name="l15293"></a><span class="lineno">15293</span>  m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l15294"></a><span class="lineno">15294</span>  vkMemReq.size,</div>
-<div class="line"><a name="l15295"></a><span class="lineno">15295</span>  alignmentForPool,</div>
-<div class="line"><a name="l15296"></a><span class="lineno">15296</span>  createInfoForPool,</div>
-<div class="line"><a name="l15297"></a><span class="lineno">15297</span>  suballocType,</div>
-<div class="line"><a name="l15298"></a><span class="lineno">15298</span>  allocationCount,</div>
-<div class="line"><a name="l15299"></a><span class="lineno">15299</span>  pAllocations);</div>
-<div class="line"><a name="l15300"></a><span class="lineno">15300</span>  }</div>
-<div class="line"><a name="l15301"></a><span class="lineno">15301</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15302"></a><span class="lineno">15302</span>  {</div>
-<div class="line"><a name="l15303"></a><span class="lineno">15303</span>  <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div>
-<div class="line"><a name="l15304"></a><span class="lineno">15304</span>  uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div>
-<div class="line"><a name="l15305"></a><span class="lineno">15305</span>  uint32_t memTypeIndex = UINT32_MAX;</div>
-<div class="line"><a name="l15306"></a><span class="lineno">15306</span>  VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &createInfo, &memTypeIndex);</div>
-<div class="line"><a name="l15307"></a><span class="lineno">15307</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15308"></a><span class="lineno">15308</span>  {</div>
-<div class="line"><a name="l15309"></a><span class="lineno">15309</span>  VkDeviceSize alignmentForMemType = VMA_MAX(</div>
-<div class="line"><a name="l15310"></a><span class="lineno">15310</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l15311"></a><span class="lineno">15311</span>  GetMemoryTypeMinAlignment(memTypeIndex));</div>
-<div class="line"><a name="l15312"></a><span class="lineno">15312</span>  </div>
-<div class="line"><a name="l15313"></a><span class="lineno">15313</span>  res = AllocateMemoryOfType(</div>
-<div class="line"><a name="l15314"></a><span class="lineno">15314</span>  vkMemReq.size,</div>
-<div class="line"><a name="l15315"></a><span class="lineno">15315</span>  alignmentForMemType,</div>
-<div class="line"><a name="l15316"></a><span class="lineno">15316</span>  requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
-<div class="line"><a name="l15317"></a><span class="lineno">15317</span>  dedicatedBuffer,</div>
-<div class="line"><a name="l15318"></a><span class="lineno">15318</span>  dedicatedImage,</div>
-<div class="line"><a name="l15319"></a><span class="lineno">15319</span>  createInfo,</div>
-<div class="line"><a name="l15320"></a><span class="lineno">15320</span>  memTypeIndex,</div>
-<div class="line"><a name="l15321"></a><span class="lineno">15321</span>  suballocType,</div>
-<div class="line"><a name="l15322"></a><span class="lineno">15322</span>  allocationCount,</div>
-<div class="line"><a name="l15323"></a><span class="lineno">15323</span>  pAllocations);</div>
-<div class="line"><a name="l15324"></a><span class="lineno">15324</span>  <span class="comment">// Succeeded on first try.</span></div>
-<div class="line"><a name="l15325"></a><span class="lineno">15325</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15326"></a><span class="lineno">15326</span>  {</div>
-<div class="line"><a name="l15327"></a><span class="lineno">15327</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15328"></a><span class="lineno">15328</span>  }</div>
-<div class="line"><a name="l15329"></a><span class="lineno">15329</span>  <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div>
-<div class="line"><a name="l15330"></a><span class="lineno">15330</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15331"></a><span class="lineno">15331</span>  {</div>
-<div class="line"><a name="l15332"></a><span class="lineno">15332</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15333"></a><span class="lineno">15333</span>  {</div>
-<div class="line"><a name="l15334"></a><span class="lineno">15334</span>  <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div>
-<div class="line"><a name="l15335"></a><span class="lineno">15335</span>  memoryTypeBits &= ~(1u << memTypeIndex);</div>
-<div class="line"><a name="l15336"></a><span class="lineno">15336</span>  <span class="comment">// Find alternative memTypeIndex.</span></div>
-<div class="line"><a name="l15337"></a><span class="lineno">15337</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &createInfo, &memTypeIndex);</div>
-<div class="line"><a name="l15338"></a><span class="lineno">15338</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15339"></a><span class="lineno">15339</span>  {</div>
-<div class="line"><a name="l15340"></a><span class="lineno">15340</span>  alignmentForMemType = VMA_MAX(</div>
-<div class="line"><a name="l15341"></a><span class="lineno">15341</span>  vkMemReq.alignment,</div>
-<div class="line"><a name="l15342"></a><span class="lineno">15342</span>  GetMemoryTypeMinAlignment(memTypeIndex));</div>
-<div class="line"><a name="l15343"></a><span class="lineno">15343</span>  </div>
-<div class="line"><a name="l15344"></a><span class="lineno">15344</span>  res = AllocateMemoryOfType(</div>
-<div class="line"><a name="l15345"></a><span class="lineno">15345</span>  vkMemReq.size,</div>
-<div class="line"><a name="l15346"></a><span class="lineno">15346</span>  alignmentForMemType,</div>
-<div class="line"><a name="l15347"></a><span class="lineno">15347</span>  requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
-<div class="line"><a name="l15348"></a><span class="lineno">15348</span>  dedicatedBuffer,</div>
-<div class="line"><a name="l15349"></a><span class="lineno">15349</span>  dedicatedImage,</div>
-<div class="line"><a name="l15350"></a><span class="lineno">15350</span>  createInfo,</div>
-<div class="line"><a name="l15351"></a><span class="lineno">15351</span>  memTypeIndex,</div>
-<div class="line"><a name="l15352"></a><span class="lineno">15352</span>  suballocType,</div>
-<div class="line"><a name="l15353"></a><span class="lineno">15353</span>  allocationCount,</div>
-<div class="line"><a name="l15354"></a><span class="lineno">15354</span>  pAllocations);</div>
-<div class="line"><a name="l15355"></a><span class="lineno">15355</span>  <span class="comment">// Allocation from this alternative memory type succeeded.</span></div>
-<div class="line"><a name="l15356"></a><span class="lineno">15356</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15357"></a><span class="lineno">15357</span>  {</div>
-<div class="line"><a name="l15358"></a><span class="lineno">15358</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15359"></a><span class="lineno">15359</span>  }</div>
-<div class="line"><a name="l15360"></a><span class="lineno">15360</span>  <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div>
-<div class="line"><a name="l15361"></a><span class="lineno">15361</span>  }</div>
-<div class="line"><a name="l15362"></a><span class="lineno">15362</span>  <span class="comment">// No other matching memory type index could be found.</span></div>
-<div class="line"><a name="l15363"></a><span class="lineno">15363</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15364"></a><span class="lineno">15364</span>  {</div>
-<div class="line"><a name="l15365"></a><span class="lineno">15365</span>  <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="l15366"></a><span class="lineno">15366</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15284"></a><span class="lineno">15284</span>  <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="l15285"></a><span class="lineno">15285</span>  {</div>
+<div class="line"><a name="l15286"></a><span class="lineno">15286</span>  <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div>
+<div class="line"><a name="l15287"></a><span class="lineno">15287</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l15288"></a><span class="lineno">15288</span>  GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.GetMemoryTypeIndex()));</div>
+<div class="line"><a name="l15289"></a><span class="lineno">15289</span>  </div>
+<div class="line"><a name="l15290"></a><span class="lineno">15290</span>  <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div>
+<div class="line"><a name="l15291"></a><span class="lineno">15291</span>  <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l15292"></a><span class="lineno">15292</span>  <span class="keywordflow">if</span>((createInfoForPool.<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>) != 0 &&</div>
+<div class="line"><a name="l15293"></a><span class="lineno">15293</span>  (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.GetMemoryTypeIndex()].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l15294"></a><span class="lineno">15294</span>  {</div>
+<div class="line"><a name="l15295"></a><span class="lineno">15295</span>  createInfoForPool.<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"><a name="l15296"></a><span class="lineno">15296</span>  }</div>
+<div class="line"><a name="l15297"></a><span class="lineno">15297</span>  </div>
+<div class="line"><a name="l15298"></a><span class="lineno">15298</span>  <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>->m_BlockVector.Allocate(</div>
+<div class="line"><a name="l15299"></a><span class="lineno">15299</span>  m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l15300"></a><span class="lineno">15300</span>  vkMemReq.size,</div>
+<div class="line"><a name="l15301"></a><span class="lineno">15301</span>  alignmentForPool,</div>
+<div class="line"><a name="l15302"></a><span class="lineno">15302</span>  createInfoForPool,</div>
+<div class="line"><a name="l15303"></a><span class="lineno">15303</span>  suballocType,</div>
+<div class="line"><a name="l15304"></a><span class="lineno">15304</span>  allocationCount,</div>
+<div class="line"><a name="l15305"></a><span class="lineno">15305</span>  pAllocations);</div>
+<div class="line"><a name="l15306"></a><span class="lineno">15306</span>  }</div>
+<div class="line"><a name="l15307"></a><span class="lineno">15307</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15308"></a><span class="lineno">15308</span>  {</div>
+<div class="line"><a name="l15309"></a><span class="lineno">15309</span>  <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div>
+<div class="line"><a name="l15310"></a><span class="lineno">15310</span>  uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div>
+<div class="line"><a name="l15311"></a><span class="lineno">15311</span>  uint32_t memTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l15312"></a><span class="lineno">15312</span>  VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &createInfo, &memTypeIndex);</div>
+<div class="line"><a name="l15313"></a><span class="lineno">15313</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15314"></a><span class="lineno">15314</span>  {</div>
+<div class="line"><a name="l15315"></a><span class="lineno">15315</span>  VkDeviceSize alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l15316"></a><span class="lineno">15316</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l15317"></a><span class="lineno">15317</span>  GetMemoryTypeMinAlignment(memTypeIndex));</div>
+<div class="line"><a name="l15318"></a><span class="lineno">15318</span>  </div>
+<div class="line"><a name="l15319"></a><span class="lineno">15319</span>  res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l15320"></a><span class="lineno">15320</span>  vkMemReq.size,</div>
+<div class="line"><a name="l15321"></a><span class="lineno">15321</span>  alignmentForMemType,</div>
+<div class="line"><a name="l15322"></a><span class="lineno">15322</span>  requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15323"></a><span class="lineno">15323</span>  dedicatedBuffer,</div>
+<div class="line"><a name="l15324"></a><span class="lineno">15324</span>  dedicatedImage,</div>
+<div class="line"><a name="l15325"></a><span class="lineno">15325</span>  createInfo,</div>
+<div class="line"><a name="l15326"></a><span class="lineno">15326</span>  memTypeIndex,</div>
+<div class="line"><a name="l15327"></a><span class="lineno">15327</span>  suballocType,</div>
+<div class="line"><a name="l15328"></a><span class="lineno">15328</span>  allocationCount,</div>
+<div class="line"><a name="l15329"></a><span class="lineno">15329</span>  pAllocations);</div>
+<div class="line"><a name="l15330"></a><span class="lineno">15330</span>  <span class="comment">// Succeeded on first try.</span></div>
+<div class="line"><a name="l15331"></a><span class="lineno">15331</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15332"></a><span class="lineno">15332</span>  {</div>
+<div class="line"><a name="l15333"></a><span class="lineno">15333</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15334"></a><span class="lineno">15334</span>  }</div>
+<div class="line"><a name="l15335"></a><span class="lineno">15335</span>  <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div>
+<div class="line"><a name="l15336"></a><span class="lineno">15336</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15337"></a><span class="lineno">15337</span>  {</div>
+<div class="line"><a name="l15338"></a><span class="lineno">15338</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15339"></a><span class="lineno">15339</span>  {</div>
+<div class="line"><a name="l15340"></a><span class="lineno">15340</span>  <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div>
+<div class="line"><a name="l15341"></a><span class="lineno">15341</span>  memoryTypeBits &= ~(1u << memTypeIndex);</div>
+<div class="line"><a name="l15342"></a><span class="lineno">15342</span>  <span class="comment">// Find alternative memTypeIndex.</span></div>
+<div class="line"><a name="l15343"></a><span class="lineno">15343</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &createInfo, &memTypeIndex);</div>
+<div class="line"><a name="l15344"></a><span class="lineno">15344</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15345"></a><span class="lineno">15345</span>  {</div>
+<div class="line"><a name="l15346"></a><span class="lineno">15346</span>  alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l15347"></a><span class="lineno">15347</span>  vkMemReq.alignment,</div>
+<div class="line"><a name="l15348"></a><span class="lineno">15348</span>  GetMemoryTypeMinAlignment(memTypeIndex));</div>
+<div class="line"><a name="l15349"></a><span class="lineno">15349</span>  </div>
+<div class="line"><a name="l15350"></a><span class="lineno">15350</span>  res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l15351"></a><span class="lineno">15351</span>  vkMemReq.size,</div>
+<div class="line"><a name="l15352"></a><span class="lineno">15352</span>  alignmentForMemType,</div>
+<div class="line"><a name="l15353"></a><span class="lineno">15353</span>  requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15354"></a><span class="lineno">15354</span>  dedicatedBuffer,</div>
+<div class="line"><a name="l15355"></a><span class="lineno">15355</span>  dedicatedImage,</div>
+<div class="line"><a name="l15356"></a><span class="lineno">15356</span>  createInfo,</div>
+<div class="line"><a name="l15357"></a><span class="lineno">15357</span>  memTypeIndex,</div>
+<div class="line"><a name="l15358"></a><span class="lineno">15358</span>  suballocType,</div>
+<div class="line"><a name="l15359"></a><span class="lineno">15359</span>  allocationCount,</div>
+<div class="line"><a name="l15360"></a><span class="lineno">15360</span>  pAllocations);</div>
+<div class="line"><a name="l15361"></a><span class="lineno">15361</span>  <span class="comment">// Allocation from this alternative memory type succeeded.</span></div>
+<div class="line"><a name="l15362"></a><span class="lineno">15362</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15363"></a><span class="lineno">15363</span>  {</div>
+<div class="line"><a name="l15364"></a><span class="lineno">15364</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15365"></a><span class="lineno">15365</span>  }</div>
+<div class="line"><a name="l15366"></a><span class="lineno">15366</span>  <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div>
<div class="line"><a name="l15367"></a><span class="lineno">15367</span>  }</div>
-<div class="line"><a name="l15368"></a><span class="lineno">15368</span>  }</div>
-<div class="line"><a name="l15369"></a><span class="lineno">15369</span>  }</div>
-<div class="line"><a name="l15370"></a><span class="lineno">15370</span>  }</div>
-<div class="line"><a name="l15371"></a><span class="lineno">15371</span>  <span class="comment">// Can't find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div>
-<div class="line"><a name="l15372"></a><span class="lineno">15372</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15373"></a><span class="lineno">15373</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15374"></a><span class="lineno">15374</span>  }</div>
-<div class="line"><a name="l15375"></a><span class="lineno">15375</span> }</div>
-<div class="line"><a name="l15376"></a><span class="lineno">15376</span>  </div>
-<div class="line"><a name="l15377"></a><span class="lineno">15377</span> <span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div>
-<div class="line"><a name="l15378"></a><span class="lineno">15378</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l15379"></a><span class="lineno">15379</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l15380"></a><span class="lineno">15380</span> {</div>
-<div class="line"><a name="l15381"></a><span class="lineno">15381</span>  VMA_ASSERT(pAllocations);</div>
+<div class="line"><a name="l15368"></a><span class="lineno">15368</span>  <span class="comment">// No other matching memory type index could be found.</span></div>
+<div class="line"><a name="l15369"></a><span class="lineno">15369</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15370"></a><span class="lineno">15370</span>  {</div>
+<div class="line"><a name="l15371"></a><span class="lineno">15371</span>  <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="l15372"></a><span class="lineno">15372</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15373"></a><span class="lineno">15373</span>  }</div>
+<div class="line"><a name="l15374"></a><span class="lineno">15374</span>  }</div>
+<div class="line"><a name="l15375"></a><span class="lineno">15375</span>  }</div>
+<div class="line"><a name="l15376"></a><span class="lineno">15376</span>  }</div>
+<div class="line"><a name="l15377"></a><span class="lineno">15377</span>  <span class="comment">// Can't find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div>
+<div class="line"><a name="l15378"></a><span class="lineno">15378</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15379"></a><span class="lineno">15379</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15380"></a><span class="lineno">15380</span>  }</div>
+<div class="line"><a name="l15381"></a><span class="lineno">15381</span> }</div>
<div class="line"><a name="l15382"></a><span class="lineno">15382</span>  </div>
-<div class="line"><a name="l15383"></a><span class="lineno">15383</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div>
-<div class="line"><a name="l15384"></a><span class="lineno">15384</span>  {</div>
-<div class="line"><a name="l15385"></a><span class="lineno">15385</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div>
-<div class="line"><a name="l15386"></a><span class="lineno">15386</span>  </div>
-<div class="line"><a name="l15387"></a><span class="lineno">15387</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l15388"></a><span class="lineno">15388</span>  {</div>
-<div class="line"><a name="l15389"></a><span class="lineno">15389</span>  <span class="keywordflow">if</span>(TouchAllocation(allocation))</div>
-<div class="line"><a name="l15390"></a><span class="lineno">15390</span>  {</div>
-<div class="line"><a name="l15391"></a><span class="lineno">15391</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l15392"></a><span class="lineno">15392</span>  {</div>
-<div class="line"><a name="l15393"></a><span class="lineno">15393</span>  FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div>
-<div class="line"><a name="l15394"></a><span class="lineno">15394</span>  }</div>
-<div class="line"><a name="l15395"></a><span class="lineno">15395</span>  </div>
-<div class="line"><a name="l15396"></a><span class="lineno">15396</span>  <span class="keywordflow">switch</span>(allocation->GetType())</div>
-<div class="line"><a name="l15397"></a><span class="lineno">15397</span>  {</div>
-<div class="line"><a name="l15398"></a><span class="lineno">15398</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l15399"></a><span class="lineno">15399</span>  {</div>
-<div class="line"><a name="l15400"></a><span class="lineno">15400</span>  VmaBlockVector* pBlockVector = VMA_NULL;</div>
-<div class="line"><a name="l15401"></a><span class="lineno">15401</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation->GetBlock()->GetParentPool();</div>
-<div class="line"><a name="l15402"></a><span class="lineno">15402</span>  <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l15403"></a><span class="lineno">15403</span>  {</div>
-<div class="line"><a name="l15404"></a><span class="lineno">15404</span>  pBlockVector = &hPool->m_BlockVector;</div>
-<div class="line"><a name="l15405"></a><span class="lineno">15405</span>  }</div>
-<div class="line"><a name="l15406"></a><span class="lineno">15406</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15407"></a><span class="lineno">15407</span>  {</div>
-<div class="line"><a name="l15408"></a><span class="lineno">15408</span>  <span class="keyword">const</span> uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l15409"></a><span class="lineno">15409</span>  pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l15410"></a><span class="lineno">15410</span>  }</div>
-<div class="line"><a name="l15411"></a><span class="lineno">15411</span>  pBlockVector->Free(allocation);</div>
-<div class="line"><a name="l15412"></a><span class="lineno">15412</span>  }</div>
-<div class="line"><a name="l15413"></a><span class="lineno">15413</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15414"></a><span class="lineno">15414</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l15415"></a><span class="lineno">15415</span>  FreeDedicatedMemory(allocation);</div>
-<div class="line"><a name="l15416"></a><span class="lineno">15416</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15417"></a><span class="lineno">15417</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l15418"></a><span class="lineno">15418</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l15419"></a><span class="lineno">15419</span>  }</div>
-<div class="line"><a name="l15420"></a><span class="lineno">15420</span>  }</div>
-<div class="line"><a name="l15421"></a><span class="lineno">15421</span>  </div>
-<div class="line"><a name="l15422"></a><span class="lineno">15422</span>  <span class="comment">// Do this regardless of whether the allocation is lost. Lost allocations still account to Budget.AllocationBytes.</span></div>
-<div class="line"><a name="l15423"></a><span class="lineno">15423</span>  m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation->GetMemoryTypeIndex()), allocation->GetSize());</div>
-<div class="line"><a name="l15424"></a><span class="lineno">15424</span>  allocation->SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
-<div class="line"><a name="l15425"></a><span class="lineno">15425</span>  allocation->Dtor();</div>
-<div class="line"><a name="l15426"></a><span class="lineno">15426</span>  m_AllocationObjectAllocator.Free(allocation);</div>
-<div class="line"><a name="l15427"></a><span class="lineno">15427</span>  }</div>
-<div class="line"><a name="l15428"></a><span class="lineno">15428</span>  }</div>
-<div class="line"><a name="l15429"></a><span class="lineno">15429</span> }</div>
-<div class="line"><a name="l15430"></a><span class="lineno">15430</span>  </div>
-<div class="line"><a name="l15431"></a><span class="lineno">15431</span> VkResult VmaAllocator_T::ResizeAllocation(</div>
-<div class="line"><a name="l15432"></a><span class="lineno">15432</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
-<div class="line"><a name="l15433"></a><span class="lineno">15433</span>  VkDeviceSize newSize)</div>
-<div class="line"><a name="l15434"></a><span class="lineno">15434</span> {</div>
-<div class="line"><a name="l15435"></a><span class="lineno">15435</span>  <span class="comment">// This function is deprecated and so it does nothing. It's left for backward compatibility.</span></div>
-<div class="line"><a name="l15436"></a><span class="lineno">15436</span>  <span class="keywordflow">if</span>(newSize == 0 || alloc->GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l15437"></a><span class="lineno">15437</span>  {</div>
-<div class="line"><a name="l15438"></a><span class="lineno">15438</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l15439"></a><span class="lineno">15439</span>  }</div>
-<div class="line"><a name="l15440"></a><span class="lineno">15440</span>  <span class="keywordflow">if</span>(newSize == alloc->GetSize())</div>
-<div class="line"><a name="l15441"></a><span class="lineno">15441</span>  {</div>
-<div class="line"><a name="l15442"></a><span class="lineno">15442</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l15443"></a><span class="lineno">15443</span>  }</div>
-<div class="line"><a name="l15444"></a><span class="lineno">15444</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div>
-<div class="line"><a name="l15445"></a><span class="lineno">15445</span> }</div>
-<div class="line"><a name="l15446"></a><span class="lineno">15446</span>  </div>
-<div class="line"><a name="l15447"></a><span class="lineno">15447</span> <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="l15448"></a><span class="lineno">15448</span> {</div>
-<div class="line"><a name="l15449"></a><span class="lineno">15449</span>  <span class="comment">// Initialize.</span></div>
-<div class="line"><a name="l15450"></a><span class="lineno">15450</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l15451"></a><span class="lineno">15451</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < VK_MAX_MEMORY_TYPES; ++i)</div>
-<div class="line"><a name="l15452"></a><span class="lineno">15452</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
-<div class="line"><a name="l15453"></a><span class="lineno">15453</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)</div>
-<div class="line"><a name="l15454"></a><span class="lineno">15454</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
-<div class="line"><a name="l15455"></a><span class="lineno">15455</span>  </div>
-<div class="line"><a name="l15456"></a><span class="lineno">15456</span>  <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l15457"></a><span class="lineno">15457</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l15458"></a><span class="lineno">15458</span>  {</div>
-<div class="line"><a name="l15459"></a><span class="lineno">15459</span>  VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l15460"></a><span class="lineno">15460</span>  VMA_ASSERT(pBlockVector);</div>
-<div class="line"><a name="l15461"></a><span class="lineno">15461</span>  pBlockVector->AddStats(pStats);</div>
-<div class="line"><a name="l15462"></a><span class="lineno">15462</span>  }</div>
-<div class="line"><a name="l15463"></a><span class="lineno">15463</span>  </div>
-<div class="line"><a name="l15464"></a><span class="lineno">15464</span>  <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l15465"></a><span class="lineno">15465</span>  {</div>
-<div class="line"><a name="l15466"></a><span class="lineno">15466</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l15467"></a><span class="lineno">15467</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)</div>
-<div class="line"><a name="l15468"></a><span class="lineno">15468</span>  {</div>
-<div class="line"><a name="l15469"></a><span class="lineno">15469</span>  m_Pools[poolIndex]->m_BlockVector.AddStats(pStats);</div>
-<div class="line"><a name="l15470"></a><span class="lineno">15470</span>  }</div>
-<div class="line"><a name="l15471"></a><span class="lineno">15471</span>  }</div>
-<div class="line"><a name="l15472"></a><span class="lineno">15472</span>  </div>
-<div class="line"><a name="l15473"></a><span class="lineno">15473</span>  <span class="comment">// Process dedicated allocations.</span></div>
-<div class="line"><a name="l15474"></a><span class="lineno">15474</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l15475"></a><span class="lineno">15475</span>  {</div>
-<div class="line"><a name="l15476"></a><span class="lineno">15476</span>  <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l15477"></a><span class="lineno">15477</span>  VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l15478"></a><span class="lineno">15478</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l15479"></a><span class="lineno">15479</span>  VMA_ASSERT(pDedicatedAllocVector);</div>
-<div class="line"><a name="l15480"></a><span class="lineno">15480</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector->size(); allocIndex < allocCount; ++allocIndex)</div>
-<div class="line"><a name="l15481"></a><span class="lineno">15481</span>  {</div>
-<div class="line"><a name="l15482"></a><span class="lineno">15482</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
-<div class="line"><a name="l15483"></a><span class="lineno">15483</span>  (*pDedicatedAllocVector)[allocIndex]->DedicatedAllocCalcStatsInfo(allocationStatInfo);</div>
-<div class="line"><a name="l15484"></a><span class="lineno">15484</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
-<div class="line"><a name="l15485"></a><span class="lineno">15485</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
-<div class="line"><a name="l15486"></a><span class="lineno">15486</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
-<div class="line"><a name="l15487"></a><span class="lineno">15487</span>  }</div>
-<div class="line"><a name="l15488"></a><span class="lineno">15488</span>  }</div>
-<div class="line"><a name="l15489"></a><span class="lineno">15489</span>  </div>
-<div class="line"><a name="l15490"></a><span class="lineno">15490</span>  <span class="comment">// Postprocess.</span></div>
-<div class="line"><a name="l15491"></a><span class="lineno">15491</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l15492"></a><span class="lineno">15492</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < GetMemoryTypeCount(); ++i)</div>
-<div class="line"><a name="l15493"></a><span class="lineno">15493</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
-<div class="line"><a name="l15494"></a><span class="lineno">15494</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < GetMemoryHeapCount(); ++i)</div>
-<div class="line"><a name="l15495"></a><span class="lineno">15495</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
-<div class="line"><a name="l15496"></a><span class="lineno">15496</span> }</div>
-<div class="line"><a name="l15497"></a><span class="lineno">15497</span>  </div>
-<div class="line"><a name="l15498"></a><span class="lineno">15498</span> <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="l15499"></a><span class="lineno">15499</span> {</div>
-<div class="line"><a name="l15500"></a><span class="lineno">15500</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15501"></a><span class="lineno">15501</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l15502"></a><span class="lineno">15502</span>  {</div>
-<div class="line"><a name="l15503"></a><span class="lineno">15503</span>  <span class="keywordflow">if</span>(m_Budget.m_OperationsSinceBudgetFetch < 30)</div>
-<div class="line"><a name="l15504"></a><span class="lineno">15504</span>  {</div>
-<div class="line"><a name="l15505"></a><span class="lineno">15505</span>  VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);</div>
-<div class="line"><a name="l15506"></a><span class="lineno">15506</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < heapCount; ++i, ++outBudget)</div>
-<div class="line"><a name="l15507"></a><span class="lineno">15507</span>  {</div>
-<div class="line"><a name="l15508"></a><span class="lineno">15508</span>  <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
-<div class="line"><a name="l15509"></a><span class="lineno">15509</span>  </div>
-<div class="line"><a name="l15510"></a><span class="lineno">15510</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l15511"></a><span class="lineno">15511</span>  outBudget-><a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
-<div class="line"><a name="l15512"></a><span class="lineno">15512</span>  </div>
-<div class="line"><a name="l15513"></a><span class="lineno">15513</span>  <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] + outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> > m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])</div>
-<div class="line"><a name="l15514"></a><span class="lineno">15514</span>  {</div>
-<div class="line"><a name="l15515"></a><span class="lineno">15515</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = m_Budget.m_VulkanUsage[heapIndex] +</div>
-<div class="line"><a name="l15516"></a><span class="lineno">15516</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
-<div class="line"><a name="l15517"></a><span class="lineno">15517</span>  }</div>
-<div class="line"><a name="l15518"></a><span class="lineno">15518</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15519"></a><span class="lineno">15519</span>  {</div>
-<div class="line"><a name="l15520"></a><span class="lineno">15520</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = 0;</div>
-<div class="line"><a name="l15521"></a><span class="lineno">15521</span>  }</div>
-<div class="line"><a name="l15522"></a><span class="lineno">15522</span>  </div>
-<div class="line"><a name="l15523"></a><span class="lineno">15523</span>  <span class="comment">// Have to take MIN with heap size because explicit HeapSizeLimit is included in it.</span></div>
-<div class="line"><a name="l15524"></a><span class="lineno">15524</span>  outBudget-><a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = VMA_MIN(</div>
-<div class="line"><a name="l15525"></a><span class="lineno">15525</span>  m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);</div>
-<div class="line"><a name="l15526"></a><span class="lineno">15526</span>  }</div>
-<div class="line"><a name="l15527"></a><span class="lineno">15527</span>  }</div>
-<div class="line"><a name="l15528"></a><span class="lineno">15528</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15529"></a><span class="lineno">15529</span>  {</div>
-<div class="line"><a name="l15530"></a><span class="lineno">15530</span>  UpdateVulkanBudget(); <span class="comment">// Outside of mutex lock</span></div>
-<div class="line"><a name="l15531"></a><span class="lineno">15531</span>  GetBudget(outBudget, firstHeap, heapCount); <span class="comment">// Recursion</span></div>
-<div class="line"><a name="l15532"></a><span class="lineno">15532</span>  }</div>
-<div class="line"><a name="l15533"></a><span class="lineno">15533</span>  }</div>
-<div class="line"><a name="l15534"></a><span class="lineno">15534</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15535"></a><span class="lineno">15535</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15536"></a><span class="lineno">15536</span>  {</div>
-<div class="line"><a name="l15537"></a><span class="lineno">15537</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < heapCount; ++i, ++outBudget)</div>
-<div class="line"><a name="l15538"></a><span class="lineno">15538</span>  {</div>
-<div class="line"><a name="l15539"></a><span class="lineno">15539</span>  <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
-<div class="line"><a name="l15540"></a><span class="lineno">15540</span>  </div>
-<div class="line"><a name="l15541"></a><span class="lineno">15541</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l15542"></a><span class="lineno">15542</span>  outBudget-><a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
-<div class="line"><a name="l15543"></a><span class="lineno">15543</span>  </div>
-<div class="line"><a name="l15544"></a><span class="lineno">15544</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
-<div class="line"><a name="l15545"></a><span class="lineno">15545</span>  outBudget-><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="l15546"></a><span class="lineno">15546</span>  }</div>
-<div class="line"><a name="l15547"></a><span class="lineno">15547</span>  }</div>
-<div class="line"><a name="l15548"></a><span class="lineno">15548</span> }</div>
+<div class="line"><a name="l15383"></a><span class="lineno">15383</span> <span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div>
+<div class="line"><a name="l15384"></a><span class="lineno">15384</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l15385"></a><span class="lineno">15385</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15386"></a><span class="lineno">15386</span> {</div>
+<div class="line"><a name="l15387"></a><span class="lineno">15387</span>  VMA_ASSERT(pAllocations);</div>
+<div class="line"><a name="l15388"></a><span class="lineno">15388</span>  </div>
+<div class="line"><a name="l15389"></a><span class="lineno">15389</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div>
+<div class="line"><a name="l15390"></a><span class="lineno">15390</span>  {</div>
+<div class="line"><a name="l15391"></a><span class="lineno">15391</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div>
+<div class="line"><a name="l15392"></a><span class="lineno">15392</span>  </div>
+<div class="line"><a name="l15393"></a><span class="lineno">15393</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15394"></a><span class="lineno">15394</span>  {</div>
+<div class="line"><a name="l15395"></a><span class="lineno">15395</span>  <span class="keywordflow">if</span>(TouchAllocation(allocation))</div>
+<div class="line"><a name="l15396"></a><span class="lineno">15396</span>  {</div>
+<div class="line"><a name="l15397"></a><span class="lineno">15397</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l15398"></a><span class="lineno">15398</span>  {</div>
+<div class="line"><a name="l15399"></a><span class="lineno">15399</span>  FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div>
+<div class="line"><a name="l15400"></a><span class="lineno">15400</span>  }</div>
+<div class="line"><a name="l15401"></a><span class="lineno">15401</span>  </div>
+<div class="line"><a name="l15402"></a><span class="lineno">15402</span>  <span class="keywordflow">switch</span>(allocation->GetType())</div>
+<div class="line"><a name="l15403"></a><span class="lineno">15403</span>  {</div>
+<div class="line"><a name="l15404"></a><span class="lineno">15404</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15405"></a><span class="lineno">15405</span>  {</div>
+<div class="line"><a name="l15406"></a><span class="lineno">15406</span>  VmaBlockVector* pBlockVector = VMA_NULL;</div>
+<div class="line"><a name="l15407"></a><span class="lineno">15407</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation->GetBlock()->GetParentPool();</div>
+<div class="line"><a name="l15408"></a><span class="lineno">15408</span>  <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15409"></a><span class="lineno">15409</span>  {</div>
+<div class="line"><a name="l15410"></a><span class="lineno">15410</span>  pBlockVector = &hPool->m_BlockVector;</div>
+<div class="line"><a name="l15411"></a><span class="lineno">15411</span>  }</div>
+<div class="line"><a name="l15412"></a><span class="lineno">15412</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15413"></a><span class="lineno">15413</span>  {</div>
+<div class="line"><a name="l15414"></a><span class="lineno">15414</span>  <span class="keyword">const</span> uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15415"></a><span class="lineno">15415</span>  pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15416"></a><span class="lineno">15416</span>  }</div>
+<div class="line"><a name="l15417"></a><span class="lineno">15417</span>  pBlockVector->Free(allocation);</div>
+<div class="line"><a name="l15418"></a><span class="lineno">15418</span>  }</div>
+<div class="line"><a name="l15419"></a><span class="lineno">15419</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15420"></a><span class="lineno">15420</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l15421"></a><span class="lineno">15421</span>  FreeDedicatedMemory(allocation);</div>
+<div class="line"><a name="l15422"></a><span class="lineno">15422</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15423"></a><span class="lineno">15423</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15424"></a><span class="lineno">15424</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l15425"></a><span class="lineno">15425</span>  }</div>
+<div class="line"><a name="l15426"></a><span class="lineno">15426</span>  }</div>
+<div class="line"><a name="l15427"></a><span class="lineno">15427</span>  </div>
+<div class="line"><a name="l15428"></a><span class="lineno">15428</span>  <span class="comment">// Do this regardless of whether the allocation is lost. Lost allocations still account to Budget.AllocationBytes.</span></div>
+<div class="line"><a name="l15429"></a><span class="lineno">15429</span>  m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation->GetMemoryTypeIndex()), allocation->GetSize());</div>
+<div class="line"><a name="l15430"></a><span class="lineno">15430</span>  allocation->SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l15431"></a><span class="lineno">15431</span>  allocation->Dtor();</div>
+<div class="line"><a name="l15432"></a><span class="lineno">15432</span>  m_AllocationObjectAllocator.Free(allocation);</div>
+<div class="line"><a name="l15433"></a><span class="lineno">15433</span>  }</div>
+<div class="line"><a name="l15434"></a><span class="lineno">15434</span>  }</div>
+<div class="line"><a name="l15435"></a><span class="lineno">15435</span> }</div>
+<div class="line"><a name="l15436"></a><span class="lineno">15436</span>  </div>
+<div class="line"><a name="l15437"></a><span class="lineno">15437</span> VkResult VmaAllocator_T::ResizeAllocation(</div>
+<div class="line"><a name="l15438"></a><span class="lineno">15438</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
+<div class="line"><a name="l15439"></a><span class="lineno">15439</span>  VkDeviceSize newSize)</div>
+<div class="line"><a name="l15440"></a><span class="lineno">15440</span> {</div>
+<div class="line"><a name="l15441"></a><span class="lineno">15441</span>  <span class="comment">// This function is deprecated and so it does nothing. It's left for backward compatibility.</span></div>
+<div class="line"><a name="l15442"></a><span class="lineno">15442</span>  <span class="keywordflow">if</span>(newSize == 0 || alloc->GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15443"></a><span class="lineno">15443</span>  {</div>
+<div class="line"><a name="l15444"></a><span class="lineno">15444</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l15445"></a><span class="lineno">15445</span>  }</div>
+<div class="line"><a name="l15446"></a><span class="lineno">15446</span>  <span class="keywordflow">if</span>(newSize == alloc->GetSize())</div>
+<div class="line"><a name="l15447"></a><span class="lineno">15447</span>  {</div>
+<div class="line"><a name="l15448"></a><span class="lineno">15448</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15449"></a><span class="lineno">15449</span>  }</div>
+<div class="line"><a name="l15450"></a><span class="lineno">15450</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div>
+<div class="line"><a name="l15451"></a><span class="lineno">15451</span> }</div>
+<div class="line"><a name="l15452"></a><span class="lineno">15452</span>  </div>
+<div class="line"><a name="l15453"></a><span class="lineno">15453</span> <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="l15454"></a><span class="lineno">15454</span> {</div>
+<div class="line"><a name="l15455"></a><span class="lineno">15455</span>  <span class="comment">// Initialize.</span></div>
+<div class="line"><a name="l15456"></a><span class="lineno">15456</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l15457"></a><span class="lineno">15457</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < VK_MAX_MEMORY_TYPES; ++i)</div>
+<div class="line"><a name="l15458"></a><span class="lineno">15458</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l15459"></a><span class="lineno">15459</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)</div>
+<div class="line"><a name="l15460"></a><span class="lineno">15460</span>  InitStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l15461"></a><span class="lineno">15461</span>  </div>
+<div class="line"><a name="l15462"></a><span class="lineno">15462</span>  <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15463"></a><span class="lineno">15463</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15464"></a><span class="lineno">15464</span>  {</div>
+<div class="line"><a name="l15465"></a><span class="lineno">15465</span>  VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15466"></a><span class="lineno">15466</span>  VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l15467"></a><span class="lineno">15467</span>  pBlockVector->AddStats(pStats);</div>
+<div class="line"><a name="l15468"></a><span class="lineno">15468</span>  }</div>
+<div class="line"><a name="l15469"></a><span class="lineno">15469</span>  </div>
+<div class="line"><a name="l15470"></a><span class="lineno">15470</span>  <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15471"></a><span class="lineno">15471</span>  {</div>
+<div class="line"><a name="l15472"></a><span class="lineno">15472</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15473"></a><span class="lineno">15473</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)</div>
+<div class="line"><a name="l15474"></a><span class="lineno">15474</span>  {</div>
+<div class="line"><a name="l15475"></a><span class="lineno">15475</span>  m_Pools[poolIndex]->m_BlockVector.AddStats(pStats);</div>
+<div class="line"><a name="l15476"></a><span class="lineno">15476</span>  }</div>
+<div class="line"><a name="l15477"></a><span class="lineno">15477</span>  }</div>
+<div class="line"><a name="l15478"></a><span class="lineno">15478</span>  </div>
+<div class="line"><a name="l15479"></a><span class="lineno">15479</span>  <span class="comment">// Process dedicated allocations.</span></div>
+<div class="line"><a name="l15480"></a><span class="lineno">15480</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15481"></a><span class="lineno">15481</span>  {</div>
+<div class="line"><a name="l15482"></a><span class="lineno">15482</span>  <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l15483"></a><span class="lineno">15483</span>  VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l15484"></a><span class="lineno">15484</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l15485"></a><span class="lineno">15485</span>  VMA_ASSERT(pDedicatedAllocVector);</div>
+<div class="line"><a name="l15486"></a><span class="lineno">15486</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector->size(); allocIndex < allocCount; ++allocIndex)</div>
+<div class="line"><a name="l15487"></a><span class="lineno">15487</span>  {</div>
+<div class="line"><a name="l15488"></a><span class="lineno">15488</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l15489"></a><span class="lineno">15489</span>  (*pDedicatedAllocVector)[allocIndex]->DedicatedAllocCalcStatsInfo(allocationStatInfo);</div>
+<div class="line"><a name="l15490"></a><span class="lineno">15490</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l15491"></a><span class="lineno">15491</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l15492"></a><span class="lineno">15492</span>  VmaAddStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
+<div class="line"><a name="l15493"></a><span class="lineno">15493</span>  }</div>
+<div class="line"><a name="l15494"></a><span class="lineno">15494</span>  }</div>
+<div class="line"><a name="l15495"></a><span class="lineno">15495</span>  </div>
+<div class="line"><a name="l15496"></a><span class="lineno">15496</span>  <span class="comment">// Postprocess.</span></div>
+<div class="line"><a name="l15497"></a><span class="lineno">15497</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l15498"></a><span class="lineno">15498</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < GetMemoryTypeCount(); ++i)</div>
+<div class="line"><a name="l15499"></a><span class="lineno">15499</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l15500"></a><span class="lineno">15500</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < GetMemoryHeapCount(); ++i)</div>
+<div class="line"><a name="l15501"></a><span class="lineno">15501</span>  VmaPostprocessCalcStatInfo(pStats-><a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l15502"></a><span class="lineno">15502</span> }</div>
+<div class="line"><a name="l15503"></a><span class="lineno">15503</span>  </div>
+<div class="line"><a name="l15504"></a><span class="lineno">15504</span> <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="l15505"></a><span class="lineno">15505</span> {</div>
+<div class="line"><a name="l15506"></a><span class="lineno">15506</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15507"></a><span class="lineno">15507</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l15508"></a><span class="lineno">15508</span>  {</div>
+<div class="line"><a name="l15509"></a><span class="lineno">15509</span>  <span class="keywordflow">if</span>(m_Budget.m_OperationsSinceBudgetFetch < 30)</div>
+<div class="line"><a name="l15510"></a><span class="lineno">15510</span>  {</div>
+<div class="line"><a name="l15511"></a><span class="lineno">15511</span>  VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l15512"></a><span class="lineno">15512</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l15513"></a><span class="lineno">15513</span>  {</div>
+<div class="line"><a name="l15514"></a><span class="lineno">15514</span>  <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l15515"></a><span class="lineno">15515</span>  </div>
+<div class="line"><a name="l15516"></a><span class="lineno">15516</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15517"></a><span class="lineno">15517</span>  outBudget-><a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
+<div class="line"><a name="l15518"></a><span class="lineno">15518</span>  </div>
+<div class="line"><a name="l15519"></a><span class="lineno">15519</span>  <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] + outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> > m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])</div>
+<div class="line"><a name="l15520"></a><span class="lineno">15520</span>  {</div>
+<div class="line"><a name="l15521"></a><span class="lineno">15521</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = m_Budget.m_VulkanUsage[heapIndex] +</div>
+<div class="line"><a name="l15522"></a><span class="lineno">15522</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
+<div class="line"><a name="l15523"></a><span class="lineno">15523</span>  }</div>
+<div class="line"><a name="l15524"></a><span class="lineno">15524</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15525"></a><span class="lineno">15525</span>  {</div>
+<div class="line"><a name="l15526"></a><span class="lineno">15526</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = 0;</div>
+<div class="line"><a name="l15527"></a><span class="lineno">15527</span>  }</div>
+<div class="line"><a name="l15528"></a><span class="lineno">15528</span>  </div>
+<div class="line"><a name="l15529"></a><span class="lineno">15529</span>  <span class="comment">// Have to take MIN with heap size because explicit HeapSizeLimit is included in it.</span></div>
+<div class="line"><a name="l15530"></a><span class="lineno">15530</span>  outBudget-><a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = VMA_MIN(</div>
+<div class="line"><a name="l15531"></a><span class="lineno">15531</span>  m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l15532"></a><span class="lineno">15532</span>  }</div>
+<div class="line"><a name="l15533"></a><span class="lineno">15533</span>  }</div>
+<div class="line"><a name="l15534"></a><span class="lineno">15534</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15535"></a><span class="lineno">15535</span>  {</div>
+<div class="line"><a name="l15536"></a><span class="lineno">15536</span>  UpdateVulkanBudget(); <span class="comment">// Outside of mutex lock</span></div>
+<div class="line"><a name="l15537"></a><span class="lineno">15537</span>  GetBudget(outBudget, firstHeap, heapCount); <span class="comment">// Recursion</span></div>
+<div class="line"><a name="l15538"></a><span class="lineno">15538</span>  }</div>
+<div class="line"><a name="l15539"></a><span class="lineno">15539</span>  }</div>
+<div class="line"><a name="l15540"></a><span class="lineno">15540</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15541"></a><span class="lineno">15541</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15542"></a><span class="lineno">15542</span>  {</div>
+<div class="line"><a name="l15543"></a><span class="lineno">15543</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l15544"></a><span class="lineno">15544</span>  {</div>
+<div class="line"><a name="l15545"></a><span class="lineno">15545</span>  <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l15546"></a><span class="lineno">15546</span>  </div>
+<div class="line"><a name="l15547"></a><span class="lineno">15547</span>  outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15548"></a><span class="lineno">15548</span>  outBudget-><a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
<div class="line"><a name="l15549"></a><span class="lineno">15549</span>  </div>
-<div class="line"><a name="l15550"></a><span class="lineno">15550</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div>
-<div class="line"><a name="l15551"></a><span class="lineno">15551</span>  </div>
-<div class="line"><a name="l15552"></a><span class="lineno">15552</span> VkResult VmaAllocator_T::DefragmentationBegin(</div>
-<div class="line"><a name="l15553"></a><span class="lineno">15553</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div>
-<div class="line"><a name="l15554"></a><span class="lineno">15554</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l15555"></a><span class="lineno">15555</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div>
-<div class="line"><a name="l15556"></a><span class="lineno">15556</span> {</div>
-<div class="line"><a name="l15557"></a><span class="lineno">15557</span>  <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="l15558"></a><span class="lineno">15558</span>  {</div>
-<div class="line"><a name="l15559"></a><span class="lineno">15559</span>  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="l15560"></a><span class="lineno">15560</span>  }</div>
-<div class="line"><a name="l15561"></a><span class="lineno">15561</span>  </div>
-<div class="line"><a name="l15562"></a><span class="lineno">15562</span>  *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div>
-<div class="line"><a name="l15563"></a><span class="lineno">15563</span>  <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="l15564"></a><span class="lineno">15564</span>  </div>
-<div class="line"><a name="l15565"></a><span class="lineno">15565</span>  (*pContext)->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="l15566"></a><span class="lineno">15566</span>  (*pContext)->AddAllocations(</div>
-<div class="line"><a name="l15567"></a><span class="lineno">15567</span>  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="l15568"></a><span class="lineno">15568</span>  </div>
-<div class="line"><a name="l15569"></a><span class="lineno">15569</span>  VkResult res = (*pContext)->Defragment(</div>
-<div class="line"><a name="l15570"></a><span class="lineno">15570</span>  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="l15571"></a><span class="lineno">15571</span>  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="l15572"></a><span class="lineno">15572</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats);</div>
-<div class="line"><a name="l15573"></a><span class="lineno">15573</span>  </div>
-<div class="line"><a name="l15574"></a><span class="lineno">15574</span>  <span class="keywordflow">if</span>(res != VK_NOT_READY)</div>
-<div class="line"><a name="l15575"></a><span class="lineno">15575</span>  {</div>
-<div class="line"><a name="l15576"></a><span class="lineno">15576</span>  vma_delete(<span class="keyword">this</span>, *pContext);</div>
-<div class="line"><a name="l15577"></a><span class="lineno">15577</span>  *pContext = VMA_NULL;</div>
-<div class="line"><a name="l15578"></a><span class="lineno">15578</span>  }</div>
+<div class="line"><a name="l15550"></a><span class="lineno">15550</span>  outBudget-><a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = outBudget-><a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
+<div class="line"><a name="l15551"></a><span class="lineno">15551</span>  outBudget-><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="l15552"></a><span class="lineno">15552</span>  }</div>
+<div class="line"><a name="l15553"></a><span class="lineno">15553</span>  }</div>
+<div class="line"><a name="l15554"></a><span class="lineno">15554</span> }</div>
+<div class="line"><a name="l15555"></a><span class="lineno">15555</span>  </div>
+<div class="line"><a name="l15556"></a><span class="lineno">15556</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div>
+<div class="line"><a name="l15557"></a><span class="lineno">15557</span>  </div>
+<div class="line"><a name="l15558"></a><span class="lineno">15558</span> VkResult VmaAllocator_T::DefragmentationBegin(</div>
+<div class="line"><a name="l15559"></a><span class="lineno">15559</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div>
+<div class="line"><a name="l15560"></a><span class="lineno">15560</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l15561"></a><span class="lineno">15561</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div>
+<div class="line"><a name="l15562"></a><span class="lineno">15562</span> {</div>
+<div class="line"><a name="l15563"></a><span class="lineno">15563</span>  <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="l15564"></a><span class="lineno">15564</span>  {</div>
+<div class="line"><a name="l15565"></a><span class="lineno">15565</span>  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="l15566"></a><span class="lineno">15566</span>  }</div>
+<div class="line"><a name="l15567"></a><span class="lineno">15567</span>  </div>
+<div class="line"><a name="l15568"></a><span class="lineno">15568</span>  *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div>
+<div class="line"><a name="l15569"></a><span class="lineno">15569</span>  <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="l15570"></a><span class="lineno">15570</span>  </div>
+<div class="line"><a name="l15571"></a><span class="lineno">15571</span>  (*pContext)->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="l15572"></a><span class="lineno">15572</span>  (*pContext)->AddAllocations(</div>
+<div class="line"><a name="l15573"></a><span class="lineno">15573</span>  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="l15574"></a><span class="lineno">15574</span>  </div>
+<div class="line"><a name="l15575"></a><span class="lineno">15575</span>  VkResult res = (*pContext)->Defragment(</div>
+<div class="line"><a name="l15576"></a><span class="lineno">15576</span>  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="l15577"></a><span class="lineno">15577</span>  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="l15578"></a><span class="lineno">15578</span>  info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats);</div>
<div class="line"><a name="l15579"></a><span class="lineno">15579</span>  </div>
-<div class="line"><a name="l15580"></a><span class="lineno">15580</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15581"></a><span class="lineno">15581</span> }</div>
-<div class="line"><a name="l15582"></a><span class="lineno">15582</span>  </div>
-<div class="line"><a name="l15583"></a><span class="lineno">15583</span> VkResult VmaAllocator_T::DefragmentationEnd(</div>
-<div class="line"><a name="l15584"></a><span class="lineno">15584</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l15585"></a><span class="lineno">15585</span> {</div>
-<div class="line"><a name="l15586"></a><span class="lineno">15586</span>  vma_delete(<span class="keyword">this</span>, context);</div>
-<div class="line"><a name="l15587"></a><span class="lineno">15587</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l15588"></a><span class="lineno">15588</span> }</div>
-<div class="line"><a name="l15589"></a><span class="lineno">15589</span>  </div>
-<div class="line"><a name="l15590"></a><span class="lineno">15590</span> <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="l15580"></a><span class="lineno">15580</span>  <span class="keywordflow">if</span>(res != VK_NOT_READY)</div>
+<div class="line"><a name="l15581"></a><span class="lineno">15581</span>  {</div>
+<div class="line"><a name="l15582"></a><span class="lineno">15582</span>  vma_delete(<span class="keyword">this</span>, *pContext);</div>
+<div class="line"><a name="l15583"></a><span class="lineno">15583</span>  *pContext = VMA_NULL;</div>
+<div class="line"><a name="l15584"></a><span class="lineno">15584</span>  }</div>
+<div class="line"><a name="l15585"></a><span class="lineno">15585</span>  </div>
+<div class="line"><a name="l15586"></a><span class="lineno">15586</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15587"></a><span class="lineno">15587</span> }</div>
+<div class="line"><a name="l15588"></a><span class="lineno">15588</span>  </div>
+<div class="line"><a name="l15589"></a><span class="lineno">15589</span> VkResult VmaAllocator_T::DefragmentationEnd(</div>
+<div class="line"><a name="l15590"></a><span class="lineno">15590</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
<div class="line"><a name="l15591"></a><span class="lineno">15591</span> {</div>
-<div class="line"><a name="l15592"></a><span class="lineno">15592</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
-<div class="line"><a name="l15593"></a><span class="lineno">15593</span>  {</div>
-<div class="line"><a name="l15594"></a><span class="lineno">15594</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l15595"></a><span class="lineno">15595</span> <span class="comment"> Warning: This is a carefully designed algorithm.</span></div>
-<div class="line"><a name="l15596"></a><span class="lineno">15596</span> <span class="comment"> Do not modify unless you really know what you're doing :)</span></div>
-<div class="line"><a name="l15597"></a><span class="lineno">15597</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l15598"></a><span class="lineno">15598</span>  <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l15599"></a><span class="lineno">15599</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
-<div class="line"><a name="l15600"></a><span class="lineno">15600</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15601"></a><span class="lineno">15601</span>  {</div>
-<div class="line"><a name="l15602"></a><span class="lineno">15602</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l15603"></a><span class="lineno">15603</span>  {</div>
-<div class="line"><a name="l15604"></a><span class="lineno">15604</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div>
-<div class="line"><a name="l15605"></a><span class="lineno">15605</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l15606"></a><span class="lineno">15606</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div>
-<div class="line"><a name="l15607"></a><span class="lineno">15607</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
-<div class="line"><a name="l15608"></a><span class="lineno">15608</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
-<div class="line"><a name="l15609"></a><span class="lineno">15609</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
-<div class="line"><a name="l15610"></a><span class="lineno">15610</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l15611"></a><span class="lineno">15611</span>  }</div>
-<div class="line"><a name="l15612"></a><span class="lineno">15612</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l15613"></a><span class="lineno">15613</span>  {</div>
-<div class="line"><a name="l15614"></a><span class="lineno">15614</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l15615"></a><span class="lineno">15615</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation->GetMemory();</div>
-<div class="line"><a name="l15616"></a><span class="lineno">15616</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation->GetOffset();</div>
-<div class="line"><a name="l15617"></a><span class="lineno">15617</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
-<div class="line"><a name="l15618"></a><span class="lineno">15618</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
-<div class="line"><a name="l15619"></a><span class="lineno">15619</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
-<div class="line"><a name="l15620"></a><span class="lineno">15620</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l15621"></a><span class="lineno">15621</span>  }</div>
-<div class="line"><a name="l15622"></a><span class="lineno">15622</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l15623"></a><span class="lineno">15623</span>  {</div>
-<div class="line"><a name="l15624"></a><span class="lineno">15624</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l15625"></a><span class="lineno">15625</span>  {</div>
-<div class="line"><a name="l15626"></a><span class="lineno">15626</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l15627"></a><span class="lineno">15627</span>  }</div>
-<div class="line"><a name="l15628"></a><span class="lineno">15628</span>  }</div>
-<div class="line"><a name="l15629"></a><span class="lineno">15629</span>  }</div>
-<div class="line"><a name="l15630"></a><span class="lineno">15630</span>  }</div>
-<div class="line"><a name="l15631"></a><span class="lineno">15631</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15632"></a><span class="lineno">15632</span>  {</div>
-<div class="line"><a name="l15633"></a><span class="lineno">15633</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l15634"></a><span class="lineno">15634</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l15635"></a><span class="lineno">15635</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
-<div class="line"><a name="l15636"></a><span class="lineno">15636</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15637"></a><span class="lineno">15637</span>  {</div>
-<div class="line"><a name="l15638"></a><span class="lineno">15638</span>  VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l15639"></a><span class="lineno">15639</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l15640"></a><span class="lineno">15640</span>  {</div>
-<div class="line"><a name="l15641"></a><span class="lineno">15641</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15642"></a><span class="lineno">15642</span>  }</div>
-<div class="line"><a name="l15643"></a><span class="lineno">15643</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l15644"></a><span class="lineno">15644</span>  {</div>
-<div class="line"><a name="l15645"></a><span class="lineno">15645</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l15646"></a><span class="lineno">15646</span>  {</div>
-<div class="line"><a name="l15647"></a><span class="lineno">15647</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l15648"></a><span class="lineno">15648</span>  }</div>
-<div class="line"><a name="l15649"></a><span class="lineno">15649</span>  }</div>
-<div class="line"><a name="l15650"></a><span class="lineno">15650</span>  }</div>
-<div class="line"><a name="l15651"></a><span class="lineno">15651</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15652"></a><span class="lineno">15652</span>  </div>
-<div class="line"><a name="l15653"></a><span class="lineno">15653</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l15654"></a><span class="lineno">15654</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation->GetMemory();</div>
-<div class="line"><a name="l15655"></a><span class="lineno">15655</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation->GetOffset();</div>
-<div class="line"><a name="l15656"></a><span class="lineno">15656</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
-<div class="line"><a name="l15657"></a><span class="lineno">15657</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation->GetMappedData();</div>
-<div class="line"><a name="l15658"></a><span class="lineno">15658</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
-<div class="line"><a name="l15659"></a><span class="lineno">15659</span>  }</div>
-<div class="line"><a name="l15660"></a><span class="lineno">15660</span> }</div>
-<div class="line"><a name="l15661"></a><span class="lineno">15661</span>  </div>
-<div class="line"><a name="l15662"></a><span class="lineno">15662</span> <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="l15663"></a><span class="lineno">15663</span> {</div>
-<div class="line"><a name="l15664"></a><span class="lineno">15664</span>  <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div>
-<div class="line"><a name="l15665"></a><span class="lineno">15665</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
-<div class="line"><a name="l15666"></a><span class="lineno">15666</span>  {</div>
-<div class="line"><a name="l15667"></a><span class="lineno">15667</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l15668"></a><span class="lineno">15668</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
-<div class="line"><a name="l15669"></a><span class="lineno">15669</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15670"></a><span class="lineno">15670</span>  {</div>
-<div class="line"><a name="l15671"></a><span class="lineno">15671</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l15672"></a><span class="lineno">15672</span>  {</div>
-<div class="line"><a name="l15673"></a><span class="lineno">15673</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15674"></a><span class="lineno">15674</span>  }</div>
-<div class="line"><a name="l15675"></a><span class="lineno">15675</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l15676"></a><span class="lineno">15676</span>  {</div>
-<div class="line"><a name="l15677"></a><span class="lineno">15677</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l15678"></a><span class="lineno">15678</span>  }</div>
-<div class="line"><a name="l15679"></a><span class="lineno">15679</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l15680"></a><span class="lineno">15680</span>  {</div>
-<div class="line"><a name="l15681"></a><span class="lineno">15681</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l15682"></a><span class="lineno">15682</span>  {</div>
-<div class="line"><a name="l15683"></a><span class="lineno">15683</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l15684"></a><span class="lineno">15684</span>  }</div>
-<div class="line"><a name="l15685"></a><span class="lineno">15685</span>  }</div>
-<div class="line"><a name="l15686"></a><span class="lineno">15686</span>  }</div>
-<div class="line"><a name="l15687"></a><span class="lineno">15687</span>  }</div>
-<div class="line"><a name="l15688"></a><span class="lineno">15688</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15689"></a><span class="lineno">15689</span>  {</div>
-<div class="line"><a name="l15690"></a><span class="lineno">15690</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l15691"></a><span class="lineno">15691</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l15692"></a><span class="lineno">15692</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
-<div class="line"><a name="l15693"></a><span class="lineno">15693</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15694"></a><span class="lineno">15694</span>  {</div>
-<div class="line"><a name="l15695"></a><span class="lineno">15695</span>  VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l15696"></a><span class="lineno">15696</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l15697"></a><span class="lineno">15697</span>  {</div>
-<div class="line"><a name="l15698"></a><span class="lineno">15698</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15699"></a><span class="lineno">15699</span>  }</div>
-<div class="line"><a name="l15700"></a><span class="lineno">15700</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l15701"></a><span class="lineno">15701</span>  {</div>
-<div class="line"><a name="l15702"></a><span class="lineno">15702</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l15703"></a><span class="lineno">15703</span>  {</div>
-<div class="line"><a name="l15704"></a><span class="lineno">15704</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l15705"></a><span class="lineno">15705</span>  }</div>
-<div class="line"><a name="l15706"></a><span class="lineno">15706</span>  }</div>
-<div class="line"><a name="l15707"></a><span class="lineno">15707</span>  }</div>
-<div class="line"><a name="l15708"></a><span class="lineno">15708</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15709"></a><span class="lineno">15709</span>  </div>
-<div class="line"><a name="l15710"></a><span class="lineno">15710</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l15711"></a><span class="lineno">15711</span>  }</div>
-<div class="line"><a name="l15712"></a><span class="lineno">15712</span> }</div>
-<div class="line"><a name="l15713"></a><span class="lineno">15713</span>  </div>
-<div class="line"><a name="l15714"></a><span class="lineno">15714</span> 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="l15715"></a><span class="lineno">15715</span> {</div>
-<div class="line"><a name="l15716"></a><span class="lineno">15716</span>  VMA_DEBUG_LOG(<span class="stringliteral">" CreatePool: MemoryTypeIndex=%u, flags=%u"</span>, pCreateInfo-><a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-><a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div>
-<div class="line"><a name="l15717"></a><span class="lineno">15717</span>  </div>
-<div class="line"><a name="l15718"></a><span class="lineno">15718</span>  <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div>
+<div class="line"><a name="l15592"></a><span class="lineno">15592</span>  vma_delete(<span class="keyword">this</span>, context);</div>
+<div class="line"><a name="l15593"></a><span class="lineno">15593</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15594"></a><span class="lineno">15594</span> }</div>
+<div class="line"><a name="l15595"></a><span class="lineno">15595</span>  </div>
+<div class="line"><a name="l15596"></a><span class="lineno">15596</span> <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="l15597"></a><span class="lineno">15597</span> {</div>
+<div class="line"><a name="l15598"></a><span class="lineno">15598</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
+<div class="line"><a name="l15599"></a><span class="lineno">15599</span>  {</div>
+<div class="line"><a name="l15600"></a><span class="lineno">15600</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l15601"></a><span class="lineno">15601</span> <span class="comment"> Warning: This is a carefully designed algorithm.</span></div>
+<div class="line"><a name="l15602"></a><span class="lineno">15602</span> <span class="comment"> Do not modify unless you really know what you're doing :)</span></div>
+<div class="line"><a name="l15603"></a><span class="lineno">15603</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l15604"></a><span class="lineno">15604</span>  <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15605"></a><span class="lineno">15605</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15606"></a><span class="lineno">15606</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15607"></a><span class="lineno">15607</span>  {</div>
+<div class="line"><a name="l15608"></a><span class="lineno">15608</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15609"></a><span class="lineno">15609</span>  {</div>
+<div class="line"><a name="l15610"></a><span class="lineno">15610</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div>
+<div class="line"><a name="l15611"></a><span class="lineno">15611</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l15612"></a><span class="lineno">15612</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div>
+<div class="line"><a name="l15613"></a><span class="lineno">15613</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
+<div class="line"><a name="l15614"></a><span class="lineno">15614</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l15615"></a><span class="lineno">15615</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
+<div class="line"><a name="l15616"></a><span class="lineno">15616</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l15617"></a><span class="lineno">15617</span>  }</div>
+<div class="line"><a name="l15618"></a><span class="lineno">15618</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15619"></a><span class="lineno">15619</span>  {</div>
+<div class="line"><a name="l15620"></a><span class="lineno">15620</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15621"></a><span class="lineno">15621</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation->GetMemory();</div>
+<div class="line"><a name="l15622"></a><span class="lineno">15622</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation->GetOffset();</div>
+<div class="line"><a name="l15623"></a><span class="lineno">15623</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
+<div class="line"><a name="l15624"></a><span class="lineno">15624</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l15625"></a><span class="lineno">15625</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
+<div class="line"><a name="l15626"></a><span class="lineno">15626</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l15627"></a><span class="lineno">15627</span>  }</div>
+<div class="line"><a name="l15628"></a><span class="lineno">15628</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15629"></a><span class="lineno">15629</span>  {</div>
+<div class="line"><a name="l15630"></a><span class="lineno">15630</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15631"></a><span class="lineno">15631</span>  {</div>
+<div class="line"><a name="l15632"></a><span class="lineno">15632</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15633"></a><span class="lineno">15633</span>  }</div>
+<div class="line"><a name="l15634"></a><span class="lineno">15634</span>  }</div>
+<div class="line"><a name="l15635"></a><span class="lineno">15635</span>  }</div>
+<div class="line"><a name="l15636"></a><span class="lineno">15636</span>  }</div>
+<div class="line"><a name="l15637"></a><span class="lineno">15637</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15638"></a><span class="lineno">15638</span>  {</div>
+<div class="line"><a name="l15639"></a><span class="lineno">15639</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l15640"></a><span class="lineno">15640</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15641"></a><span class="lineno">15641</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15642"></a><span class="lineno">15642</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15643"></a><span class="lineno">15643</span>  {</div>
+<div class="line"><a name="l15644"></a><span class="lineno">15644</span>  VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l15645"></a><span class="lineno">15645</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15646"></a><span class="lineno">15646</span>  {</div>
+<div class="line"><a name="l15647"></a><span class="lineno">15647</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15648"></a><span class="lineno">15648</span>  }</div>
+<div class="line"><a name="l15649"></a><span class="lineno">15649</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15650"></a><span class="lineno">15650</span>  {</div>
+<div class="line"><a name="l15651"></a><span class="lineno">15651</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15652"></a><span class="lineno">15652</span>  {</div>
+<div class="line"><a name="l15653"></a><span class="lineno">15653</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15654"></a><span class="lineno">15654</span>  }</div>
+<div class="line"><a name="l15655"></a><span class="lineno">15655</span>  }</div>
+<div class="line"><a name="l15656"></a><span class="lineno">15656</span>  }</div>
+<div class="line"><a name="l15657"></a><span class="lineno">15657</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15658"></a><span class="lineno">15658</span>  </div>
+<div class="line"><a name="l15659"></a><span class="lineno">15659</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15660"></a><span class="lineno">15660</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation->GetMemory();</div>
+<div class="line"><a name="l15661"></a><span class="lineno">15661</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation->GetOffset();</div>
+<div class="line"><a name="l15662"></a><span class="lineno">15662</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation->GetSize();</div>
+<div class="line"><a name="l15663"></a><span class="lineno">15663</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation->GetMappedData();</div>
+<div class="line"><a name="l15664"></a><span class="lineno">15664</span>  pAllocationInfo-><a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation->GetUserData();</div>
+<div class="line"><a name="l15665"></a><span class="lineno">15665</span>  }</div>
+<div class="line"><a name="l15666"></a><span class="lineno">15666</span> }</div>
+<div class="line"><a name="l15667"></a><span class="lineno">15667</span>  </div>
+<div class="line"><a name="l15668"></a><span class="lineno">15668</span> <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="l15669"></a><span class="lineno">15669</span> {</div>
+<div class="line"><a name="l15670"></a><span class="lineno">15670</span>  <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div>
+<div class="line"><a name="l15671"></a><span class="lineno">15671</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
+<div class="line"><a name="l15672"></a><span class="lineno">15672</span>  {</div>
+<div class="line"><a name="l15673"></a><span class="lineno">15673</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15674"></a><span class="lineno">15674</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15675"></a><span class="lineno">15675</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15676"></a><span class="lineno">15676</span>  {</div>
+<div class="line"><a name="l15677"></a><span class="lineno">15677</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l15678"></a><span class="lineno">15678</span>  {</div>
+<div class="line"><a name="l15679"></a><span class="lineno">15679</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l15680"></a><span class="lineno">15680</span>  }</div>
+<div class="line"><a name="l15681"></a><span class="lineno">15681</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15682"></a><span class="lineno">15682</span>  {</div>
+<div class="line"><a name="l15683"></a><span class="lineno">15683</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15684"></a><span class="lineno">15684</span>  }</div>
+<div class="line"><a name="l15685"></a><span class="lineno">15685</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15686"></a><span class="lineno">15686</span>  {</div>
+<div class="line"><a name="l15687"></a><span class="lineno">15687</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15688"></a><span class="lineno">15688</span>  {</div>
+<div class="line"><a name="l15689"></a><span class="lineno">15689</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15690"></a><span class="lineno">15690</span>  }</div>
+<div class="line"><a name="l15691"></a><span class="lineno">15691</span>  }</div>
+<div class="line"><a name="l15692"></a><span class="lineno">15692</span>  }</div>
+<div class="line"><a name="l15693"></a><span class="lineno">15693</span>  }</div>
+<div class="line"><a name="l15694"></a><span class="lineno">15694</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15695"></a><span class="lineno">15695</span>  {</div>
+<div class="line"><a name="l15696"></a><span class="lineno">15696</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l15697"></a><span class="lineno">15697</span>  uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l15698"></a><span class="lineno">15698</span>  uint32_t localLastUseFrameIndex = hAllocation->GetLastUseFrameIndex();</div>
+<div class="line"><a name="l15699"></a><span class="lineno">15699</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15700"></a><span class="lineno">15700</span>  {</div>
+<div class="line"><a name="l15701"></a><span class="lineno">15701</span>  VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l15702"></a><span class="lineno">15702</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l15703"></a><span class="lineno">15703</span>  {</div>
+<div class="line"><a name="l15704"></a><span class="lineno">15704</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15705"></a><span class="lineno">15705</span>  }</div>
+<div class="line"><a name="l15706"></a><span class="lineno">15706</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l15707"></a><span class="lineno">15707</span>  {</div>
+<div class="line"><a name="l15708"></a><span class="lineno">15708</span>  <span class="keywordflow">if</span>(hAllocation->CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l15709"></a><span class="lineno">15709</span>  {</div>
+<div class="line"><a name="l15710"></a><span class="lineno">15710</span>  localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l15711"></a><span class="lineno">15711</span>  }</div>
+<div class="line"><a name="l15712"></a><span class="lineno">15712</span>  }</div>
+<div class="line"><a name="l15713"></a><span class="lineno">15713</span>  }</div>
+<div class="line"><a name="l15714"></a><span class="lineno">15714</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15715"></a><span class="lineno">15715</span>  </div>
+<div class="line"><a name="l15716"></a><span class="lineno">15716</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15717"></a><span class="lineno">15717</span>  }</div>
+<div class="line"><a name="l15718"></a><span class="lineno">15718</span> }</div>
<div class="line"><a name="l15719"></a><span class="lineno">15719</span>  </div>
-<div class="line"><a name="l15720"></a><span class="lineno">15720</span>  <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="l15721"></a><span class="lineno">15721</span>  {</div>
-<div class="line"><a name="l15722"></a><span class="lineno">15722</span>  newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div>
-<div class="line"><a name="l15723"></a><span class="lineno">15723</span>  }</div>
-<div class="line"><a name="l15724"></a><span class="lineno">15724</span>  <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> > newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div>
-<div class="line"><a name="l15725"></a><span class="lineno">15725</span>  {</div>
-<div class="line"><a name="l15726"></a><span class="lineno">15726</span>  <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l15727"></a><span class="lineno">15727</span>  }</div>
-<div class="line"><a name="l15728"></a><span class="lineno">15728</span>  </div>
-<div class="line"><a name="l15729"></a><span class="lineno">15729</span>  <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="l15730"></a><span class="lineno">15730</span>  </div>
-<div class="line"><a name="l15731"></a><span class="lineno">15731</span>  *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div>
-<div class="line"><a name="l15732"></a><span class="lineno">15732</span>  </div>
-<div class="line"><a name="l15733"></a><span class="lineno">15733</span>  VkResult res = (*pPool)->m_BlockVector.CreateMinBlocks();</div>
-<div class="line"><a name="l15734"></a><span class="lineno">15734</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l15735"></a><span class="lineno">15735</span>  {</div>
-<div class="line"><a name="l15736"></a><span class="lineno">15736</span>  vma_delete(<span class="keyword">this</span>, *pPool);</div>
-<div class="line"><a name="l15737"></a><span class="lineno">15737</span>  *pPool = VMA_NULL;</div>
-<div class="line"><a name="l15738"></a><span class="lineno">15738</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15739"></a><span class="lineno">15739</span>  }</div>
-<div class="line"><a name="l15740"></a><span class="lineno">15740</span>  </div>
-<div class="line"><a name="l15741"></a><span class="lineno">15741</span>  <span class="comment">// Add to m_Pools.</span></div>
-<div class="line"><a name="l15742"></a><span class="lineno">15742</span>  {</div>
-<div class="line"><a name="l15743"></a><span class="lineno">15743</span>  VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l15744"></a><span class="lineno">15744</span>  (*pPool)->SetId(m_NextPoolId++);</div>
-<div class="line"><a name="l15745"></a><span class="lineno">15745</span>  VmaVectorInsertSorted<VmaPointerLess>(m_Pools, *pPool);</div>
-<div class="line"><a name="l15746"></a><span class="lineno">15746</span>  }</div>
-<div class="line"><a name="l15747"></a><span class="lineno">15747</span>  </div>
-<div class="line"><a name="l15748"></a><span class="lineno">15748</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l15749"></a><span class="lineno">15749</span> }</div>
-<div class="line"><a name="l15750"></a><span class="lineno">15750</span>  </div>
-<div class="line"><a name="l15751"></a><span class="lineno">15751</span> <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="l15752"></a><span class="lineno">15752</span> {</div>
-<div class="line"><a name="l15753"></a><span class="lineno">15753</span>  <span class="comment">// Remove from m_Pools.</span></div>
-<div class="line"><a name="l15754"></a><span class="lineno">15754</span>  {</div>
-<div class="line"><a name="l15755"></a><span class="lineno">15755</span>  VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l15756"></a><span class="lineno">15756</span>  <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted<VmaPointerLess>(m_Pools, pool);</div>
-<div class="line"><a name="l15757"></a><span class="lineno">15757</span>  VMA_ASSERT(success && <span class="stringliteral">"Pool not found in Allocator."</span>);</div>
-<div class="line"><a name="l15758"></a><span class="lineno">15758</span>  }</div>
-<div class="line"><a name="l15759"></a><span class="lineno">15759</span>  </div>
-<div class="line"><a name="l15760"></a><span class="lineno">15760</span>  vma_delete(<span class="keyword">this</span>, pool);</div>
-<div class="line"><a name="l15761"></a><span class="lineno">15761</span> }</div>
-<div class="line"><a name="l15762"></a><span class="lineno">15762</span>  </div>
-<div class="line"><a name="l15763"></a><span class="lineno">15763</span> <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="l15764"></a><span class="lineno">15764</span> {</div>
-<div class="line"><a name="l15765"></a><span class="lineno">15765</span>  pool->m_BlockVector.GetPoolStats(pPoolStats);</div>
-<div class="line"><a name="l15766"></a><span class="lineno">15766</span> }</div>
-<div class="line"><a name="l15767"></a><span class="lineno">15767</span>  </div>
-<div class="line"><a name="l15768"></a><span class="lineno">15768</span> <span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div>
-<div class="line"><a name="l15769"></a><span class="lineno">15769</span> {</div>
-<div class="line"><a name="l15770"></a><span class="lineno">15770</span>  m_CurrentFrameIndex.store(frameIndex);</div>
-<div class="line"><a name="l15771"></a><span class="lineno">15771</span>  </div>
-<div class="line"><a name="l15772"></a><span class="lineno">15772</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15773"></a><span class="lineno">15773</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l15774"></a><span class="lineno">15774</span>  {</div>
-<div class="line"><a name="l15775"></a><span class="lineno">15775</span>  UpdateVulkanBudget();</div>
-<div class="line"><a name="l15776"></a><span class="lineno">15776</span>  }</div>
-<div class="line"><a name="l15777"></a><span class="lineno">15777</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15778"></a><span class="lineno">15778</span> }</div>
-<div class="line"><a name="l15779"></a><span class="lineno">15779</span>  </div>
-<div class="line"><a name="l15780"></a><span class="lineno">15780</span> <span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div>
-<div class="line"><a name="l15781"></a><span class="lineno">15781</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
-<div class="line"><a name="l15782"></a><span class="lineno">15782</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l15783"></a><span class="lineno">15783</span> {</div>
-<div class="line"><a name="l15784"></a><span class="lineno">15784</span>  hPool->m_BlockVector.MakePoolAllocationsLost(</div>
-<div class="line"><a name="l15785"></a><span class="lineno">15785</span>  m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l15786"></a><span class="lineno">15786</span>  pLostAllocationCount);</div>
-<div class="line"><a name="l15787"></a><span class="lineno">15787</span> }</div>
-<div class="line"><a name="l15788"></a><span class="lineno">15788</span>  </div>
-<div class="line"><a name="l15789"></a><span class="lineno">15789</span> VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div>
-<div class="line"><a name="l15790"></a><span class="lineno">15790</span> {</div>
-<div class="line"><a name="l15791"></a><span class="lineno">15791</span>  <span class="keywordflow">return</span> hPool->m_BlockVector.CheckCorruption();</div>
-<div class="line"><a name="l15792"></a><span class="lineno">15792</span> }</div>
-<div class="line"><a name="l15793"></a><span class="lineno">15793</span>  </div>
-<div class="line"><a name="l15794"></a><span class="lineno">15794</span> VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div>
-<div class="line"><a name="l15795"></a><span class="lineno">15795</span> {</div>
-<div class="line"><a name="l15796"></a><span class="lineno">15796</span>  VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l15797"></a><span class="lineno">15797</span>  </div>
-<div class="line"><a name="l15798"></a><span class="lineno">15798</span>  <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l15799"></a><span class="lineno">15799</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l15800"></a><span class="lineno">15800</span>  {</div>
-<div class="line"><a name="l15801"></a><span class="lineno">15801</span>  <span class="keywordflow">if</span>(((1u << memTypeIndex) & memoryTypeBits) != 0)</div>
-<div class="line"><a name="l15802"></a><span class="lineno">15802</span>  {</div>
-<div class="line"><a name="l15803"></a><span class="lineno">15803</span>  VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l15804"></a><span class="lineno">15804</span>  VMA_ASSERT(pBlockVector);</div>
-<div class="line"><a name="l15805"></a><span class="lineno">15805</span>  VkResult localRes = pBlockVector->CheckCorruption();</div>
-<div class="line"><a name="l15806"></a><span class="lineno">15806</span>  <span class="keywordflow">switch</span>(localRes)</div>
-<div class="line"><a name="l15807"></a><span class="lineno">15807</span>  {</div>
-<div class="line"><a name="l15808"></a><span class="lineno">15808</span>  <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
-<div class="line"><a name="l15809"></a><span class="lineno">15809</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15810"></a><span class="lineno">15810</span>  <span class="keywordflow">case</span> VK_SUCCESS:</div>
-<div class="line"><a name="l15811"></a><span class="lineno">15811</span>  finalRes = VK_SUCCESS;</div>
-<div class="line"><a name="l15812"></a><span class="lineno">15812</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15813"></a><span class="lineno">15813</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l15814"></a><span class="lineno">15814</span>  <span class="keywordflow">return</span> localRes;</div>
-<div class="line"><a name="l15815"></a><span class="lineno">15815</span>  }</div>
-<div class="line"><a name="l15816"></a><span class="lineno">15816</span>  }</div>
-<div class="line"><a name="l15817"></a><span class="lineno">15817</span>  }</div>
-<div class="line"><a name="l15818"></a><span class="lineno">15818</span>  </div>
-<div class="line"><a name="l15819"></a><span class="lineno">15819</span>  <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l15820"></a><span class="lineno">15820</span>  {</div>
-<div class="line"><a name="l15821"></a><span class="lineno">15821</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l15822"></a><span class="lineno">15822</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)</div>
-<div class="line"><a name="l15823"></a><span class="lineno">15823</span>  {</div>
-<div class="line"><a name="l15824"></a><span class="lineno">15824</span>  <span class="keywordflow">if</span>(((1u << m_Pools[poolIndex]->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)</div>
-<div class="line"><a name="l15825"></a><span class="lineno">15825</span>  {</div>
-<div class="line"><a name="l15826"></a><span class="lineno">15826</span>  VkResult localRes = m_Pools[poolIndex]->m_BlockVector.CheckCorruption();</div>
-<div class="line"><a name="l15827"></a><span class="lineno">15827</span>  <span class="keywordflow">switch</span>(localRes)</div>
-<div class="line"><a name="l15828"></a><span class="lineno">15828</span>  {</div>
-<div class="line"><a name="l15829"></a><span class="lineno">15829</span>  <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
-<div class="line"><a name="l15830"></a><span class="lineno">15830</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15831"></a><span class="lineno">15831</span>  <span class="keywordflow">case</span> VK_SUCCESS:</div>
-<div class="line"><a name="l15832"></a><span class="lineno">15832</span>  finalRes = VK_SUCCESS;</div>
-<div class="line"><a name="l15833"></a><span class="lineno">15833</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15834"></a><span class="lineno">15834</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l15835"></a><span class="lineno">15835</span>  <span class="keywordflow">return</span> localRes;</div>
-<div class="line"><a name="l15836"></a><span class="lineno">15836</span>  }</div>
-<div class="line"><a name="l15837"></a><span class="lineno">15837</span>  }</div>
-<div class="line"><a name="l15838"></a><span class="lineno">15838</span>  }</div>
-<div class="line"><a name="l15839"></a><span class="lineno">15839</span>  }</div>
-<div class="line"><a name="l15840"></a><span class="lineno">15840</span>  </div>
-<div class="line"><a name="l15841"></a><span class="lineno">15841</span>  <span class="keywordflow">return</span> finalRes;</div>
-<div class="line"><a name="l15842"></a><span class="lineno">15842</span> }</div>
-<div class="line"><a name="l15843"></a><span class="lineno">15843</span>  </div>
-<div class="line"><a name="l15844"></a><span class="lineno">15844</span> <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="l15845"></a><span class="lineno">15845</span> {</div>
-<div class="line"><a name="l15846"></a><span class="lineno">15846</span>  *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
-<div class="line"><a name="l15847"></a><span class="lineno">15847</span>  (*pAllocation)->Ctor(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l15848"></a><span class="lineno">15848</span>  (*pAllocation)->InitLost();</div>
-<div class="line"><a name="l15849"></a><span class="lineno">15849</span> }</div>
-<div class="line"><a name="l15850"></a><span class="lineno">15850</span>  </div>
-<div class="line"><a name="l15851"></a><span class="lineno">15851</span> VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div>
-<div class="line"><a name="l15852"></a><span class="lineno">15852</span> {</div>
-<div class="line"><a name="l15853"></a><span class="lineno">15853</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo->memoryTypeIndex);</div>
-<div class="line"><a name="l15854"></a><span class="lineno">15854</span>  </div>
-<div class="line"><a name="l15855"></a><span class="lineno">15855</span>  <span class="comment">// HeapSizeLimit is in effect for this heap.</span></div>
-<div class="line"><a name="l15856"></a><span class="lineno">15856</span>  <span class="keywordflow">if</span>((m_HeapSizeLimitMask & (1u << heapIndex)) != 0)</div>
-<div class="line"><a name="l15857"></a><span class="lineno">15857</span>  {</div>
-<div class="line"><a name="l15858"></a><span class="lineno">15858</span>  <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
-<div class="line"><a name="l15859"></a><span class="lineno">15859</span>  VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l15860"></a><span class="lineno">15860</span>  <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l15861"></a><span class="lineno">15861</span>  {</div>
-<div class="line"><a name="l15862"></a><span class="lineno">15862</span>  <span class="keyword">const</span> VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo->allocationSize;</div>
-<div class="line"><a name="l15863"></a><span class="lineno">15863</span>  <span class="keywordflow">if</span>(blockBytesAfterAllocation > heapSize)</div>
-<div class="line"><a name="l15864"></a><span class="lineno">15864</span>  {</div>
-<div class="line"><a name="l15865"></a><span class="lineno">15865</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15866"></a><span class="lineno">15866</span>  }</div>
-<div class="line"><a name="l15867"></a><span class="lineno">15867</span>  <span class="keywordflow">if</span>(m_Budget.m_BlockBytes->compare_exchange_strong(blockBytes, blockBytesAfterAllocation))</div>
-<div class="line"><a name="l15868"></a><span class="lineno">15868</span>  {</div>
-<div class="line"><a name="l15869"></a><span class="lineno">15869</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l15870"></a><span class="lineno">15870</span>  }</div>
-<div class="line"><a name="l15871"></a><span class="lineno">15871</span>  }</div>
-<div class="line"><a name="l15872"></a><span class="lineno">15872</span>  }</div>
-<div class="line"><a name="l15873"></a><span class="lineno">15873</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15874"></a><span class="lineno">15874</span>  {</div>
-<div class="line"><a name="l15875"></a><span class="lineno">15875</span>  m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo->allocationSize;</div>
-<div class="line"><a name="l15876"></a><span class="lineno">15876</span>  }</div>
-<div class="line"><a name="l15877"></a><span class="lineno">15877</span>  </div>
-<div class="line"><a name="l15878"></a><span class="lineno">15878</span>  <span class="comment">// VULKAN CALL vkAllocateMemory.</span></div>
-<div class="line"><a name="l15879"></a><span class="lineno">15879</span>  VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div>
-<div class="line"><a name="l15880"></a><span class="lineno">15880</span>  </div>
-<div class="line"><a name="l15881"></a><span class="lineno">15881</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15882"></a><span class="lineno">15882</span>  {</div>
-<div class="line"><a name="l15883"></a><span class="lineno">15883</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15884"></a><span class="lineno">15884</span>  ++m_Budget.m_OperationsSinceBudgetFetch;</div>
-<div class="line"><a name="l15885"></a><span class="lineno">15885</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15720"></a><span class="lineno">15720</span> 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="l15721"></a><span class="lineno">15721</span> {</div>
+<div class="line"><a name="l15722"></a><span class="lineno">15722</span>  VMA_DEBUG_LOG(<span class="stringliteral">" CreatePool: MemoryTypeIndex=%u, flags=%u"</span>, pCreateInfo-><a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-><a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div>
+<div class="line"><a name="l15723"></a><span class="lineno">15723</span>  </div>
+<div class="line"><a name="l15724"></a><span class="lineno">15724</span>  <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div>
+<div class="line"><a name="l15725"></a><span class="lineno">15725</span>  </div>
+<div class="line"><a name="l15726"></a><span class="lineno">15726</span>  <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="l15727"></a><span class="lineno">15727</span>  {</div>
+<div class="line"><a name="l15728"></a><span class="lineno">15728</span>  newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div>
+<div class="line"><a name="l15729"></a><span class="lineno">15729</span>  }</div>
+<div class="line"><a name="l15730"></a><span class="lineno">15730</span>  <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> > newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div>
+<div class="line"><a name="l15731"></a><span class="lineno">15731</span>  {</div>
+<div class="line"><a name="l15732"></a><span class="lineno">15732</span>  <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l15733"></a><span class="lineno">15733</span>  }</div>
+<div class="line"><a name="l15734"></a><span class="lineno">15734</span>  </div>
+<div class="line"><a name="l15735"></a><span class="lineno">15735</span>  <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="l15736"></a><span class="lineno">15736</span>  </div>
+<div class="line"><a name="l15737"></a><span class="lineno">15737</span>  *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div>
+<div class="line"><a name="l15738"></a><span class="lineno">15738</span>  </div>
+<div class="line"><a name="l15739"></a><span class="lineno">15739</span>  VkResult res = (*pPool)->m_BlockVector.CreateMinBlocks();</div>
+<div class="line"><a name="l15740"></a><span class="lineno">15740</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l15741"></a><span class="lineno">15741</span>  {</div>
+<div class="line"><a name="l15742"></a><span class="lineno">15742</span>  vma_delete(<span class="keyword">this</span>, *pPool);</div>
+<div class="line"><a name="l15743"></a><span class="lineno">15743</span>  *pPool = VMA_NULL;</div>
+<div class="line"><a name="l15744"></a><span class="lineno">15744</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15745"></a><span class="lineno">15745</span>  }</div>
+<div class="line"><a name="l15746"></a><span class="lineno">15746</span>  </div>
+<div class="line"><a name="l15747"></a><span class="lineno">15747</span>  <span class="comment">// Add to m_Pools.</span></div>
+<div class="line"><a name="l15748"></a><span class="lineno">15748</span>  {</div>
+<div class="line"><a name="l15749"></a><span class="lineno">15749</span>  VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15750"></a><span class="lineno">15750</span>  (*pPool)->SetId(m_NextPoolId++);</div>
+<div class="line"><a name="l15751"></a><span class="lineno">15751</span>  VmaVectorInsertSorted<VmaPointerLess>(m_Pools, *pPool);</div>
+<div class="line"><a name="l15752"></a><span class="lineno">15752</span>  }</div>
+<div class="line"><a name="l15753"></a><span class="lineno">15753</span>  </div>
+<div class="line"><a name="l15754"></a><span class="lineno">15754</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15755"></a><span class="lineno">15755</span> }</div>
+<div class="line"><a name="l15756"></a><span class="lineno">15756</span>  </div>
+<div class="line"><a name="l15757"></a><span class="lineno">15757</span> <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="l15758"></a><span class="lineno">15758</span> {</div>
+<div class="line"><a name="l15759"></a><span class="lineno">15759</span>  <span class="comment">// Remove from m_Pools.</span></div>
+<div class="line"><a name="l15760"></a><span class="lineno">15760</span>  {</div>
+<div class="line"><a name="l15761"></a><span class="lineno">15761</span>  VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15762"></a><span class="lineno">15762</span>  <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted<VmaPointerLess>(m_Pools, pool);</div>
+<div class="line"><a name="l15763"></a><span class="lineno">15763</span>  VMA_ASSERT(success && <span class="stringliteral">"Pool not found in Allocator."</span>);</div>
+<div class="line"><a name="l15764"></a><span class="lineno">15764</span>  }</div>
+<div class="line"><a name="l15765"></a><span class="lineno">15765</span>  </div>
+<div class="line"><a name="l15766"></a><span class="lineno">15766</span>  vma_delete(<span class="keyword">this</span>, pool);</div>
+<div class="line"><a name="l15767"></a><span class="lineno">15767</span> }</div>
+<div class="line"><a name="l15768"></a><span class="lineno">15768</span>  </div>
+<div class="line"><a name="l15769"></a><span class="lineno">15769</span> <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="l15770"></a><span class="lineno">15770</span> {</div>
+<div class="line"><a name="l15771"></a><span class="lineno">15771</span>  pool->m_BlockVector.GetPoolStats(pPoolStats);</div>
+<div class="line"><a name="l15772"></a><span class="lineno">15772</span> }</div>
+<div class="line"><a name="l15773"></a><span class="lineno">15773</span>  </div>
+<div class="line"><a name="l15774"></a><span class="lineno">15774</span> <span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div>
+<div class="line"><a name="l15775"></a><span class="lineno">15775</span> {</div>
+<div class="line"><a name="l15776"></a><span class="lineno">15776</span>  m_CurrentFrameIndex.store(frameIndex);</div>
+<div class="line"><a name="l15777"></a><span class="lineno">15777</span>  </div>
+<div class="line"><a name="l15778"></a><span class="lineno">15778</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15779"></a><span class="lineno">15779</span>  <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l15780"></a><span class="lineno">15780</span>  {</div>
+<div class="line"><a name="l15781"></a><span class="lineno">15781</span>  UpdateVulkanBudget();</div>
+<div class="line"><a name="l15782"></a><span class="lineno">15782</span>  }</div>
+<div class="line"><a name="l15783"></a><span class="lineno">15783</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15784"></a><span class="lineno">15784</span> }</div>
+<div class="line"><a name="l15785"></a><span class="lineno">15785</span>  </div>
+<div class="line"><a name="l15786"></a><span class="lineno">15786</span> <span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l15787"></a><span class="lineno">15787</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
+<div class="line"><a name="l15788"></a><span class="lineno">15788</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l15789"></a><span class="lineno">15789</span> {</div>
+<div class="line"><a name="l15790"></a><span class="lineno">15790</span>  hPool->m_BlockVector.MakePoolAllocationsLost(</div>
+<div class="line"><a name="l15791"></a><span class="lineno">15791</span>  m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l15792"></a><span class="lineno">15792</span>  pLostAllocationCount);</div>
+<div class="line"><a name="l15793"></a><span class="lineno">15793</span> }</div>
+<div class="line"><a name="l15794"></a><span class="lineno">15794</span>  </div>
+<div class="line"><a name="l15795"></a><span class="lineno">15795</span> VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div>
+<div class="line"><a name="l15796"></a><span class="lineno">15796</span> {</div>
+<div class="line"><a name="l15797"></a><span class="lineno">15797</span>  <span class="keywordflow">return</span> hPool->m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l15798"></a><span class="lineno">15798</span> }</div>
+<div class="line"><a name="l15799"></a><span class="lineno">15799</span>  </div>
+<div class="line"><a name="l15800"></a><span class="lineno">15800</span> VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div>
+<div class="line"><a name="l15801"></a><span class="lineno">15801</span> {</div>
+<div class="line"><a name="l15802"></a><span class="lineno">15802</span>  VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l15803"></a><span class="lineno">15803</span>  </div>
+<div class="line"><a name="l15804"></a><span class="lineno">15804</span>  <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15805"></a><span class="lineno">15805</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l15806"></a><span class="lineno">15806</span>  {</div>
+<div class="line"><a name="l15807"></a><span class="lineno">15807</span>  <span class="keywordflow">if</span>(((1u << memTypeIndex) & memoryTypeBits) != 0)</div>
+<div class="line"><a name="l15808"></a><span class="lineno">15808</span>  {</div>
+<div class="line"><a name="l15809"></a><span class="lineno">15809</span>  VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l15810"></a><span class="lineno">15810</span>  VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l15811"></a><span class="lineno">15811</span>  VkResult localRes = pBlockVector->CheckCorruption();</div>
+<div class="line"><a name="l15812"></a><span class="lineno">15812</span>  <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l15813"></a><span class="lineno">15813</span>  {</div>
+<div class="line"><a name="l15814"></a><span class="lineno">15814</span>  <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l15815"></a><span class="lineno">15815</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15816"></a><span class="lineno">15816</span>  <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l15817"></a><span class="lineno">15817</span>  finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l15818"></a><span class="lineno">15818</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15819"></a><span class="lineno">15819</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15820"></a><span class="lineno">15820</span>  <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l15821"></a><span class="lineno">15821</span>  }</div>
+<div class="line"><a name="l15822"></a><span class="lineno">15822</span>  }</div>
+<div class="line"><a name="l15823"></a><span class="lineno">15823</span>  }</div>
+<div class="line"><a name="l15824"></a><span class="lineno">15824</span>  </div>
+<div class="line"><a name="l15825"></a><span class="lineno">15825</span>  <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15826"></a><span class="lineno">15826</span>  {</div>
+<div class="line"><a name="l15827"></a><span class="lineno">15827</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l15828"></a><span class="lineno">15828</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)</div>
+<div class="line"><a name="l15829"></a><span class="lineno">15829</span>  {</div>
+<div class="line"><a name="l15830"></a><span class="lineno">15830</span>  <span class="keywordflow">if</span>(((1u << m_Pools[poolIndex]->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)</div>
+<div class="line"><a name="l15831"></a><span class="lineno">15831</span>  {</div>
+<div class="line"><a name="l15832"></a><span class="lineno">15832</span>  VkResult localRes = m_Pools[poolIndex]->m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l15833"></a><span class="lineno">15833</span>  <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l15834"></a><span class="lineno">15834</span>  {</div>
+<div class="line"><a name="l15835"></a><span class="lineno">15835</span>  <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l15836"></a><span class="lineno">15836</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15837"></a><span class="lineno">15837</span>  <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l15838"></a><span class="lineno">15838</span>  finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l15839"></a><span class="lineno">15839</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15840"></a><span class="lineno">15840</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l15841"></a><span class="lineno">15841</span>  <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l15842"></a><span class="lineno">15842</span>  }</div>
+<div class="line"><a name="l15843"></a><span class="lineno">15843</span>  }</div>
+<div class="line"><a name="l15844"></a><span class="lineno">15844</span>  }</div>
+<div class="line"><a name="l15845"></a><span class="lineno">15845</span>  }</div>
+<div class="line"><a name="l15846"></a><span class="lineno">15846</span>  </div>
+<div class="line"><a name="l15847"></a><span class="lineno">15847</span>  <span class="keywordflow">return</span> finalRes;</div>
+<div class="line"><a name="l15848"></a><span class="lineno">15848</span> }</div>
+<div class="line"><a name="l15849"></a><span class="lineno">15849</span>  </div>
+<div class="line"><a name="l15850"></a><span class="lineno">15850</span> <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="l15851"></a><span class="lineno">15851</span> {</div>
+<div class="line"><a name="l15852"></a><span class="lineno">15852</span>  *pAllocation = m_AllocationObjectAllocator.Allocate();</div>
+<div class="line"><a name="l15853"></a><span class="lineno">15853</span>  (*pAllocation)->Ctor(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l15854"></a><span class="lineno">15854</span>  (*pAllocation)->InitLost();</div>
+<div class="line"><a name="l15855"></a><span class="lineno">15855</span> }</div>
+<div class="line"><a name="l15856"></a><span class="lineno">15856</span>  </div>
+<div class="line"><a name="l15857"></a><span class="lineno">15857</span> VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div>
+<div class="line"><a name="l15858"></a><span class="lineno">15858</span> {</div>
+<div class="line"><a name="l15859"></a><span class="lineno">15859</span>  <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo->memoryTypeIndex);</div>
+<div class="line"><a name="l15860"></a><span class="lineno">15860</span>  </div>
+<div class="line"><a name="l15861"></a><span class="lineno">15861</span>  <span class="comment">// HeapSizeLimit is in effect for this heap.</span></div>
+<div class="line"><a name="l15862"></a><span class="lineno">15862</span>  <span class="keywordflow">if</span>((m_HeapSizeLimitMask & (1u << heapIndex)) != 0)</div>
+<div class="line"><a name="l15863"></a><span class="lineno">15863</span>  {</div>
+<div class="line"><a name="l15864"></a><span class="lineno">15864</span>  <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l15865"></a><span class="lineno">15865</span>  VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l15866"></a><span class="lineno">15866</span>  <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l15867"></a><span class="lineno">15867</span>  {</div>
+<div class="line"><a name="l15868"></a><span class="lineno">15868</span>  <span class="keyword">const</span> VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo->allocationSize;</div>
+<div class="line"><a name="l15869"></a><span class="lineno">15869</span>  <span class="keywordflow">if</span>(blockBytesAfterAllocation > heapSize)</div>
+<div class="line"><a name="l15870"></a><span class="lineno">15870</span>  {</div>
+<div class="line"><a name="l15871"></a><span class="lineno">15871</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l15872"></a><span class="lineno">15872</span>  }</div>
+<div class="line"><a name="l15873"></a><span class="lineno">15873</span>  <span class="keywordflow">if</span>(m_Budget.m_BlockBytes[heapIndex].compare_exchange_strong(blockBytes, blockBytesAfterAllocation))</div>
+<div class="line"><a name="l15874"></a><span class="lineno">15874</span>  {</div>
+<div class="line"><a name="l15875"></a><span class="lineno">15875</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15876"></a><span class="lineno">15876</span>  }</div>
+<div class="line"><a name="l15877"></a><span class="lineno">15877</span>  }</div>
+<div class="line"><a name="l15878"></a><span class="lineno">15878</span>  }</div>
+<div class="line"><a name="l15879"></a><span class="lineno">15879</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15880"></a><span class="lineno">15880</span>  {</div>
+<div class="line"><a name="l15881"></a><span class="lineno">15881</span>  m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo->allocationSize;</div>
+<div class="line"><a name="l15882"></a><span class="lineno">15882</span>  }</div>
+<div class="line"><a name="l15883"></a><span class="lineno">15883</span>  </div>
+<div class="line"><a name="l15884"></a><span class="lineno">15884</span>  <span class="comment">// VULKAN CALL vkAllocateMemory.</span></div>
+<div class="line"><a name="l15885"></a><span class="lineno">15885</span>  VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div>
<div class="line"><a name="l15886"></a><span class="lineno">15886</span>  </div>
-<div class="line"><a name="l15887"></a><span class="lineno">15887</span>  <span class="comment">// Informative callback.</span></div>
-<div class="line"><a name="l15888"></a><span class="lineno">15888</span>  <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="l15889"></a><span class="lineno">15889</span>  {</div>
-<div class="line"><a name="l15890"></a><span class="lineno">15890</span>  (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize);</div>
-<div class="line"><a name="l15891"></a><span class="lineno">15891</span>  }</div>
-<div class="line"><a name="l15892"></a><span class="lineno">15892</span>  }</div>
-<div class="line"><a name="l15893"></a><span class="lineno">15893</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15894"></a><span class="lineno">15894</span>  {</div>
-<div class="line"><a name="l15895"></a><span class="lineno">15895</span>  m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo->allocationSize;</div>
-<div class="line"><a name="l15896"></a><span class="lineno">15896</span>  }</div>
-<div class="line"><a name="l15897"></a><span class="lineno">15897</span>  </div>
-<div class="line"><a name="l15898"></a><span class="lineno">15898</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15899"></a><span class="lineno">15899</span> }</div>
-<div class="line"><a name="l15900"></a><span class="lineno">15900</span>  </div>
-<div class="line"><a name="l15901"></a><span class="lineno">15901</span> <span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div>
-<div class="line"><a name="l15902"></a><span class="lineno">15902</span> {</div>
-<div class="line"><a name="l15903"></a><span class="lineno">15903</span>  <span class="comment">// Informative callback.</span></div>
-<div class="line"><a name="l15904"></a><span class="lineno">15904</span>  <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="l15905"></a><span class="lineno">15905</span>  {</div>
-<div class="line"><a name="l15906"></a><span class="lineno">15906</span>  (*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="l15907"></a><span class="lineno">15907</span>  }</div>
-<div class="line"><a name="l15908"></a><span class="lineno">15908</span>  </div>
-<div class="line"><a name="l15909"></a><span class="lineno">15909</span>  <span class="comment">// VULKAN CALL vkFreeMemory.</span></div>
-<div class="line"><a name="l15910"></a><span class="lineno">15910</span>  (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div>
-<div class="line"><a name="l15911"></a><span class="lineno">15911</span>  </div>
-<div class="line"><a name="l15912"></a><span class="lineno">15912</span>  m_Budget.m_BlockBytes[MemoryTypeIndexToHeapIndex(memoryType)] -= size;</div>
-<div class="line"><a name="l15913"></a><span class="lineno">15913</span> }</div>
+<div class="line"><a name="l15887"></a><span class="lineno">15887</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15888"></a><span class="lineno">15888</span>  {</div>
+<div class="line"><a name="l15889"></a><span class="lineno">15889</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15890"></a><span class="lineno">15890</span>  ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l15891"></a><span class="lineno">15891</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15892"></a><span class="lineno">15892</span>  </div>
+<div class="line"><a name="l15893"></a><span class="lineno">15893</span>  <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l15894"></a><span class="lineno">15894</span>  <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="l15895"></a><span class="lineno">15895</span>  {</div>
+<div class="line"><a name="l15896"></a><span class="lineno">15896</span>  (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize);</div>
+<div class="line"><a name="l15897"></a><span class="lineno">15897</span>  }</div>
+<div class="line"><a name="l15898"></a><span class="lineno">15898</span>  }</div>
+<div class="line"><a name="l15899"></a><span class="lineno">15899</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15900"></a><span class="lineno">15900</span>  {</div>
+<div class="line"><a name="l15901"></a><span class="lineno">15901</span>  m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo->allocationSize;</div>
+<div class="line"><a name="l15902"></a><span class="lineno">15902</span>  }</div>
+<div class="line"><a name="l15903"></a><span class="lineno">15903</span>  </div>
+<div class="line"><a name="l15904"></a><span class="lineno">15904</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15905"></a><span class="lineno">15905</span> }</div>
+<div class="line"><a name="l15906"></a><span class="lineno">15906</span>  </div>
+<div class="line"><a name="l15907"></a><span class="lineno">15907</span> <span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div>
+<div class="line"><a name="l15908"></a><span class="lineno">15908</span> {</div>
+<div class="line"><a name="l15909"></a><span class="lineno">15909</span>  <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l15910"></a><span class="lineno">15910</span>  <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="l15911"></a><span class="lineno">15911</span>  {</div>
+<div class="line"><a name="l15912"></a><span class="lineno">15912</span>  (*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="l15913"></a><span class="lineno">15913</span>  }</div>
<div class="line"><a name="l15914"></a><span class="lineno">15914</span>  </div>
-<div class="line"><a name="l15915"></a><span class="lineno">15915</span> VkResult VmaAllocator_T::BindVulkanBuffer(</div>
-<div class="line"><a name="l15916"></a><span class="lineno">15916</span>  VkDeviceMemory memory,</div>
-<div class="line"><a name="l15917"></a><span class="lineno">15917</span>  VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l15918"></a><span class="lineno">15918</span>  VkBuffer buffer,</div>
-<div class="line"><a name="l15919"></a><span class="lineno">15919</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l15920"></a><span class="lineno">15920</span> {</div>
-<div class="line"><a name="l15921"></a><span class="lineno">15921</span>  <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
-<div class="line"><a name="l15922"></a><span class="lineno">15922</span>  {</div>
-<div class="line"><a name="l15923"></a><span class="lineno">15923</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l15924"></a><span class="lineno">15924</span>  <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&</div>
-<div class="line"><a name="l15925"></a><span class="lineno">15925</span>  m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div>
-<div class="line"><a name="l15926"></a><span class="lineno">15926</span>  {</div>
-<div class="line"><a name="l15927"></a><span class="lineno">15927</span>  VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div>
-<div class="line"><a name="l15928"></a><span class="lineno">15928</span>  bindBufferMemoryInfo.pNext = pNext;</div>
-<div class="line"><a name="l15929"></a><span class="lineno">15929</span>  bindBufferMemoryInfo.buffer = buffer;</div>
-<div class="line"><a name="l15930"></a><span class="lineno">15930</span>  bindBufferMemoryInfo.memory = memory;</div>
-<div class="line"><a name="l15931"></a><span class="lineno">15931</span>  bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
-<div class="line"><a name="l15932"></a><span class="lineno">15932</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);</div>
-<div class="line"><a name="l15933"></a><span class="lineno">15933</span>  }</div>
-<div class="line"><a name="l15934"></a><span class="lineno">15934</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15935"></a><span class="lineno">15935</span> <span class="preprocessor">#endif // #if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l15936"></a><span class="lineno">15936</span>  {</div>
-<div class="line"><a name="l15937"></a><span class="lineno">15937</span>  <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
-<div class="line"><a name="l15938"></a><span class="lineno">15938</span>  }</div>
-<div class="line"><a name="l15939"></a><span class="lineno">15939</span>  }</div>
-<div class="line"><a name="l15940"></a><span class="lineno">15940</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15941"></a><span class="lineno">15941</span>  {</div>
-<div class="line"><a name="l15942"></a><span class="lineno">15942</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div>
-<div class="line"><a name="l15943"></a><span class="lineno">15943</span>  }</div>
-<div class="line"><a name="l15944"></a><span class="lineno">15944</span> }</div>
-<div class="line"><a name="l15945"></a><span class="lineno">15945</span>  </div>
-<div class="line"><a name="l15946"></a><span class="lineno">15946</span> VkResult VmaAllocator_T::BindVulkanImage(</div>
-<div class="line"><a name="l15947"></a><span class="lineno">15947</span>  VkDeviceMemory memory,</div>
-<div class="line"><a name="l15948"></a><span class="lineno">15948</span>  VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l15949"></a><span class="lineno">15949</span>  VkImage image,</div>
-<div class="line"><a name="l15950"></a><span class="lineno">15950</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l15951"></a><span class="lineno">15951</span> {</div>
-<div class="line"><a name="l15952"></a><span class="lineno">15952</span>  <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
-<div class="line"><a name="l15953"></a><span class="lineno">15953</span>  {</div>
-<div class="line"><a name="l15954"></a><span class="lineno">15954</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l15955"></a><span class="lineno">15955</span>  <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&</div>
-<div class="line"><a name="l15956"></a><span class="lineno">15956</span>  m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div>
-<div class="line"><a name="l15957"></a><span class="lineno">15957</span>  {</div>
-<div class="line"><a name="l15958"></a><span class="lineno">15958</span>  VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div>
-<div class="line"><a name="l15959"></a><span class="lineno">15959</span>  bindBufferMemoryInfo.pNext = pNext;</div>
-<div class="line"><a name="l15960"></a><span class="lineno">15960</span>  bindBufferMemoryInfo.image = image;</div>
-<div class="line"><a name="l15961"></a><span class="lineno">15961</span>  bindBufferMemoryInfo.memory = memory;</div>
-<div class="line"><a name="l15962"></a><span class="lineno">15962</span>  bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
-<div class="line"><a name="l15963"></a><span class="lineno">15963</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);</div>
-<div class="line"><a name="l15964"></a><span class="lineno">15964</span>  }</div>
-<div class="line"><a name="l15965"></a><span class="lineno">15965</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15966"></a><span class="lineno">15966</span> <span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l15967"></a><span class="lineno">15967</span>  {</div>
-<div class="line"><a name="l15968"></a><span class="lineno">15968</span>  <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
-<div class="line"><a name="l15969"></a><span class="lineno">15969</span>  }</div>
-<div class="line"><a name="l15970"></a><span class="lineno">15970</span>  }</div>
-<div class="line"><a name="l15971"></a><span class="lineno">15971</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15972"></a><span class="lineno">15972</span>  {</div>
-<div class="line"><a name="l15973"></a><span class="lineno">15973</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div>
-<div class="line"><a name="l15974"></a><span class="lineno">15974</span>  }</div>
-<div class="line"><a name="l15975"></a><span class="lineno">15975</span> }</div>
-<div class="line"><a name="l15976"></a><span class="lineno">15976</span>  </div>
-<div class="line"><a name="l15977"></a><span class="lineno">15977</span> 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="l15978"></a><span class="lineno">15978</span> {</div>
-<div class="line"><a name="l15979"></a><span class="lineno">15979</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
-<div class="line"><a name="l15980"></a><span class="lineno">15980</span>  {</div>
-<div class="line"><a name="l15981"></a><span class="lineno">15981</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
-<div class="line"><a name="l15982"></a><span class="lineno">15982</span>  }</div>
-<div class="line"><a name="l15983"></a><span class="lineno">15983</span>  </div>
-<div class="line"><a name="l15984"></a><span class="lineno">15984</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
-<div class="line"><a name="l15985"></a><span class="lineno">15985</span>  {</div>
-<div class="line"><a name="l15986"></a><span class="lineno">15986</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l15987"></a><span class="lineno">15987</span>  {</div>
-<div class="line"><a name="l15988"></a><span class="lineno">15988</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
-<div class="line"><a name="l15989"></a><span class="lineno">15989</span>  <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div>
-<div class="line"><a name="l15990"></a><span class="lineno">15990</span>  VkResult res = pBlock->Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&pBytes);</div>
-<div class="line"><a name="l15991"></a><span class="lineno">15991</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15992"></a><span class="lineno">15992</span>  {</div>
-<div class="line"><a name="l15993"></a><span class="lineno">15993</span>  *ppData = pBytes + (ptrdiff_t)hAllocation->GetOffset();</div>
-<div class="line"><a name="l15994"></a><span class="lineno">15994</span>  hAllocation->BlockAllocMap();</div>
-<div class="line"><a name="l15995"></a><span class="lineno">15995</span>  }</div>
-<div class="line"><a name="l15996"></a><span class="lineno">15996</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15997"></a><span class="lineno">15997</span>  }</div>
-<div class="line"><a name="l15998"></a><span class="lineno">15998</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l15999"></a><span class="lineno">15999</span>  <span class="keywordflow">return</span> hAllocation->DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div>
-<div class="line"><a name="l16000"></a><span class="lineno">16000</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16001"></a><span class="lineno">16001</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16002"></a><span class="lineno">16002</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
-<div class="line"><a name="l16003"></a><span class="lineno">16003</span>  }</div>
-<div class="line"><a name="l16004"></a><span class="lineno">16004</span> }</div>
-<div class="line"><a name="l16005"></a><span class="lineno">16005</span>  </div>
-<div class="line"><a name="l16006"></a><span class="lineno">16006</span> <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="l16007"></a><span class="lineno">16007</span> {</div>
-<div class="line"><a name="l16008"></a><span class="lineno">16008</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
-<div class="line"><a name="l16009"></a><span class="lineno">16009</span>  {</div>
-<div class="line"><a name="l16010"></a><span class="lineno">16010</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l16011"></a><span class="lineno">16011</span>  {</div>
-<div class="line"><a name="l16012"></a><span class="lineno">16012</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
-<div class="line"><a name="l16013"></a><span class="lineno">16013</span>  hAllocation->BlockAllocUnmap();</div>
-<div class="line"><a name="l16014"></a><span class="lineno">16014</span>  pBlock->Unmap(<span class="keyword">this</span>, 1);</div>
-<div class="line"><a name="l16015"></a><span class="lineno">16015</span>  }</div>
-<div class="line"><a name="l16016"></a><span class="lineno">16016</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16017"></a><span class="lineno">16017</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l16018"></a><span class="lineno">16018</span>  hAllocation->DedicatedAllocUnmap(<span class="keyword">this</span>);</div>
-<div class="line"><a name="l16019"></a><span class="lineno">16019</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16020"></a><span class="lineno">16020</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16021"></a><span class="lineno">16021</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16022"></a><span class="lineno">16022</span>  }</div>
-<div class="line"><a name="l16023"></a><span class="lineno">16023</span> }</div>
-<div class="line"><a name="l16024"></a><span class="lineno">16024</span>  </div>
-<div class="line"><a name="l16025"></a><span class="lineno">16025</span> VkResult VmaAllocator_T::BindBufferMemory(</div>
-<div class="line"><a name="l16026"></a><span class="lineno">16026</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l16027"></a><span class="lineno">16027</span>  VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l16028"></a><span class="lineno">16028</span>  VkBuffer hBuffer,</div>
-<div class="line"><a name="l16029"></a><span class="lineno">16029</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l16030"></a><span class="lineno">16030</span> {</div>
-<div class="line"><a name="l16031"></a><span class="lineno">16031</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l16032"></a><span class="lineno">16032</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
-<div class="line"><a name="l16033"></a><span class="lineno">16033</span>  {</div>
-<div class="line"><a name="l16034"></a><span class="lineno">16034</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l16035"></a><span class="lineno">16035</span>  res = BindVulkanBuffer(hAllocation->GetMemory(), allocationLocalOffset, hBuffer, pNext);</div>
-<div class="line"><a name="l16036"></a><span class="lineno">16036</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16037"></a><span class="lineno">16037</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l16038"></a><span class="lineno">16038</span>  {</div>
-<div class="line"><a name="l16039"></a><span class="lineno">16039</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
-<div class="line"><a name="l16040"></a><span class="lineno">16040</span>  VMA_ASSERT(pBlock && <span class="stringliteral">"Binding buffer to allocation that doesn't belong to any block. Is the allocation lost?"</span>);</div>
-<div class="line"><a name="l16041"></a><span class="lineno">16041</span>  res = pBlock->BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l15915"></a><span class="lineno">15915</span>  <span class="comment">// VULKAN CALL vkFreeMemory.</span></div>
+<div class="line"><a name="l15916"></a><span class="lineno">15916</span>  (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div>
+<div class="line"><a name="l15917"></a><span class="lineno">15917</span>  </div>
+<div class="line"><a name="l15918"></a><span class="lineno">15918</span>  m_Budget.m_BlockBytes[MemoryTypeIndexToHeapIndex(memoryType)] -= size;</div>
+<div class="line"><a name="l15919"></a><span class="lineno">15919</span> }</div>
+<div class="line"><a name="l15920"></a><span class="lineno">15920</span>  </div>
+<div class="line"><a name="l15921"></a><span class="lineno">15921</span> VkResult VmaAllocator_T::BindVulkanBuffer(</div>
+<div class="line"><a name="l15922"></a><span class="lineno">15922</span>  VkDeviceMemory memory,</div>
+<div class="line"><a name="l15923"></a><span class="lineno">15923</span>  VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l15924"></a><span class="lineno">15924</span>  VkBuffer buffer,</div>
+<div class="line"><a name="l15925"></a><span class="lineno">15925</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15926"></a><span class="lineno">15926</span> {</div>
+<div class="line"><a name="l15927"></a><span class="lineno">15927</span>  <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l15928"></a><span class="lineno">15928</span>  {</div>
+<div class="line"><a name="l15929"></a><span class="lineno">15929</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15930"></a><span class="lineno">15930</span>  <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&</div>
+<div class="line"><a name="l15931"></a><span class="lineno">15931</span>  m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l15932"></a><span class="lineno">15932</span>  {</div>
+<div class="line"><a name="l15933"></a><span class="lineno">15933</span>  VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l15934"></a><span class="lineno">15934</span>  bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l15935"></a><span class="lineno">15935</span>  bindBufferMemoryInfo.buffer = buffer;</div>
+<div class="line"><a name="l15936"></a><span class="lineno">15936</span>  bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l15937"></a><span class="lineno">15937</span>  bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l15938"></a><span class="lineno">15938</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);</div>
+<div class="line"><a name="l15939"></a><span class="lineno">15939</span>  }</div>
+<div class="line"><a name="l15940"></a><span class="lineno">15940</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15941"></a><span class="lineno">15941</span> <span class="preprocessor">#endif // #if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15942"></a><span class="lineno">15942</span>  {</div>
+<div class="line"><a name="l15943"></a><span class="lineno">15943</span>  <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l15944"></a><span class="lineno">15944</span>  }</div>
+<div class="line"><a name="l15945"></a><span class="lineno">15945</span>  }</div>
+<div class="line"><a name="l15946"></a><span class="lineno">15946</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15947"></a><span class="lineno">15947</span>  {</div>
+<div class="line"><a name="l15948"></a><span class="lineno">15948</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div>
+<div class="line"><a name="l15949"></a><span class="lineno">15949</span>  }</div>
+<div class="line"><a name="l15950"></a><span class="lineno">15950</span> }</div>
+<div class="line"><a name="l15951"></a><span class="lineno">15951</span>  </div>
+<div class="line"><a name="l15952"></a><span class="lineno">15952</span> VkResult VmaAllocator_T::BindVulkanImage(</div>
+<div class="line"><a name="l15953"></a><span class="lineno">15953</span>  VkDeviceMemory memory,</div>
+<div class="line"><a name="l15954"></a><span class="lineno">15954</span>  VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l15955"></a><span class="lineno">15955</span>  VkImage image,</div>
+<div class="line"><a name="l15956"></a><span class="lineno">15956</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l15957"></a><span class="lineno">15957</span> {</div>
+<div class="line"><a name="l15958"></a><span class="lineno">15958</span>  <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l15959"></a><span class="lineno">15959</span>  {</div>
+<div class="line"><a name="l15960"></a><span class="lineno">15960</span> <span class="preprocessor">#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15961"></a><span class="lineno">15961</span>  <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&</div>
+<div class="line"><a name="l15962"></a><span class="lineno">15962</span>  m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l15963"></a><span class="lineno">15963</span>  {</div>
+<div class="line"><a name="l15964"></a><span class="lineno">15964</span>  VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l15965"></a><span class="lineno">15965</span>  bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l15966"></a><span class="lineno">15966</span>  bindBufferMemoryInfo.image = image;</div>
+<div class="line"><a name="l15967"></a><span class="lineno">15967</span>  bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l15968"></a><span class="lineno">15968</span>  bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l15969"></a><span class="lineno">15969</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);</div>
+<div class="line"><a name="l15970"></a><span class="lineno">15970</span>  }</div>
+<div class="line"><a name="l15971"></a><span class="lineno">15971</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15972"></a><span class="lineno">15972</span> <span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15973"></a><span class="lineno">15973</span>  {</div>
+<div class="line"><a name="l15974"></a><span class="lineno">15974</span>  <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l15975"></a><span class="lineno">15975</span>  }</div>
+<div class="line"><a name="l15976"></a><span class="lineno">15976</span>  }</div>
+<div class="line"><a name="l15977"></a><span class="lineno">15977</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15978"></a><span class="lineno">15978</span>  {</div>
+<div class="line"><a name="l15979"></a><span class="lineno">15979</span>  <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div>
+<div class="line"><a name="l15980"></a><span class="lineno">15980</span>  }</div>
+<div class="line"><a name="l15981"></a><span class="lineno">15981</span> }</div>
+<div class="line"><a name="l15982"></a><span class="lineno">15982</span>  </div>
+<div class="line"><a name="l15983"></a><span class="lineno">15983</span> 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="l15984"></a><span class="lineno">15984</span> {</div>
+<div class="line"><a name="l15985"></a><span class="lineno">15985</span>  <span class="keywordflow">if</span>(hAllocation->CanBecomeLost())</div>
+<div class="line"><a name="l15986"></a><span class="lineno">15986</span>  {</div>
+<div class="line"><a name="l15987"></a><span class="lineno">15987</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l15988"></a><span class="lineno">15988</span>  }</div>
+<div class="line"><a name="l15989"></a><span class="lineno">15989</span>  </div>
+<div class="line"><a name="l15990"></a><span class="lineno">15990</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
+<div class="line"><a name="l15991"></a><span class="lineno">15991</span>  {</div>
+<div class="line"><a name="l15992"></a><span class="lineno">15992</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l15993"></a><span class="lineno">15993</span>  {</div>
+<div class="line"><a name="l15994"></a><span class="lineno">15994</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
+<div class="line"><a name="l15995"></a><span class="lineno">15995</span>  <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div>
+<div class="line"><a name="l15996"></a><span class="lineno">15996</span>  VkResult res = pBlock->Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&pBytes);</div>
+<div class="line"><a name="l15997"></a><span class="lineno">15997</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l15998"></a><span class="lineno">15998</span>  {</div>
+<div class="line"><a name="l15999"></a><span class="lineno">15999</span>  *ppData = pBytes + (ptrdiff_t)hAllocation->GetOffset();</div>
+<div class="line"><a name="l16000"></a><span class="lineno">16000</span>  hAllocation->BlockAllocMap();</div>
+<div class="line"><a name="l16001"></a><span class="lineno">16001</span>  }</div>
+<div class="line"><a name="l16002"></a><span class="lineno">16002</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16003"></a><span class="lineno">16003</span>  }</div>
+<div class="line"><a name="l16004"></a><span class="lineno">16004</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16005"></a><span class="lineno">16005</span>  <span class="keywordflow">return</span> hAllocation->DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div>
+<div class="line"><a name="l16006"></a><span class="lineno">16006</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16007"></a><span class="lineno">16007</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16008"></a><span class="lineno">16008</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l16009"></a><span class="lineno">16009</span>  }</div>
+<div class="line"><a name="l16010"></a><span class="lineno">16010</span> }</div>
+<div class="line"><a name="l16011"></a><span class="lineno">16011</span>  </div>
+<div class="line"><a name="l16012"></a><span class="lineno">16012</span> <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="l16013"></a><span class="lineno">16013</span> {</div>
+<div class="line"><a name="l16014"></a><span class="lineno">16014</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
+<div class="line"><a name="l16015"></a><span class="lineno">16015</span>  {</div>
+<div class="line"><a name="l16016"></a><span class="lineno">16016</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l16017"></a><span class="lineno">16017</span>  {</div>
+<div class="line"><a name="l16018"></a><span class="lineno">16018</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
+<div class="line"><a name="l16019"></a><span class="lineno">16019</span>  hAllocation->BlockAllocUnmap();</div>
+<div class="line"><a name="l16020"></a><span class="lineno">16020</span>  pBlock->Unmap(<span class="keyword">this</span>, 1);</div>
+<div class="line"><a name="l16021"></a><span class="lineno">16021</span>  }</div>
+<div class="line"><a name="l16022"></a><span class="lineno">16022</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16023"></a><span class="lineno">16023</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16024"></a><span class="lineno">16024</span>  hAllocation->DedicatedAllocUnmap(<span class="keyword">this</span>);</div>
+<div class="line"><a name="l16025"></a><span class="lineno">16025</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16026"></a><span class="lineno">16026</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16027"></a><span class="lineno">16027</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16028"></a><span class="lineno">16028</span>  }</div>
+<div class="line"><a name="l16029"></a><span class="lineno">16029</span> }</div>
+<div class="line"><a name="l16030"></a><span class="lineno">16030</span>  </div>
+<div class="line"><a name="l16031"></a><span class="lineno">16031</span> VkResult VmaAllocator_T::BindBufferMemory(</div>
+<div class="line"><a name="l16032"></a><span class="lineno">16032</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l16033"></a><span class="lineno">16033</span>  VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l16034"></a><span class="lineno">16034</span>  VkBuffer hBuffer,</div>
+<div class="line"><a name="l16035"></a><span class="lineno">16035</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l16036"></a><span class="lineno">16036</span> {</div>
+<div class="line"><a name="l16037"></a><span class="lineno">16037</span>  VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l16038"></a><span class="lineno">16038</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
+<div class="line"><a name="l16039"></a><span class="lineno">16039</span>  {</div>
+<div class="line"><a name="l16040"></a><span class="lineno">16040</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16041"></a><span class="lineno">16041</span>  res = BindVulkanBuffer(hAllocation->GetMemory(), allocationLocalOffset, hBuffer, pNext);</div>
<div class="line"><a name="l16042"></a><span class="lineno">16042</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16043"></a><span class="lineno">16043</span>  }</div>
-<div class="line"><a name="l16044"></a><span class="lineno">16044</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16045"></a><span class="lineno">16045</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16046"></a><span class="lineno">16046</span>  }</div>
-<div class="line"><a name="l16047"></a><span class="lineno">16047</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16048"></a><span class="lineno">16048</span> }</div>
-<div class="line"><a name="l16049"></a><span class="lineno">16049</span>  </div>
-<div class="line"><a name="l16050"></a><span class="lineno">16050</span> VkResult VmaAllocator_T::BindImageMemory(</div>
-<div class="line"><a name="l16051"></a><span class="lineno">16051</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l16052"></a><span class="lineno">16052</span>  VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l16053"></a><span class="lineno">16053</span>  VkImage hImage,</div>
-<div class="line"><a name="l16054"></a><span class="lineno">16054</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l16055"></a><span class="lineno">16055</span> {</div>
-<div class="line"><a name="l16056"></a><span class="lineno">16056</span>  VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l16057"></a><span class="lineno">16057</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
-<div class="line"><a name="l16058"></a><span class="lineno">16058</span>  {</div>
-<div class="line"><a name="l16059"></a><span class="lineno">16059</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l16060"></a><span class="lineno">16060</span>  res = BindVulkanImage(hAllocation->GetMemory(), allocationLocalOffset, hImage, pNext);</div>
-<div class="line"><a name="l16061"></a><span class="lineno">16061</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16062"></a><span class="lineno">16062</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l16063"></a><span class="lineno">16063</span>  {</div>
-<div class="line"><a name="l16064"></a><span class="lineno">16064</span>  VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();</div>
-<div class="line"><a name="l16065"></a><span class="lineno">16065</span>  VMA_ASSERT(pBlock && <span class="stringliteral">"Binding image to allocation that doesn't belong to any block. Is the allocation lost?"</span>);</div>
-<div class="line"><a name="l16066"></a><span class="lineno">16066</span>  res = pBlock->BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l16043"></a><span class="lineno">16043</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l16044"></a><span class="lineno">16044</span>  {</div>
+<div class="line"><a name="l16045"></a><span class="lineno">16045</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation->GetBlock();</div>
+<div class="line"><a name="l16046"></a><span class="lineno">16046</span>  VMA_ASSERT(pBlock && <span class="stringliteral">"Binding buffer to allocation that doesn't belong to any block. Is the allocation lost?"</span>);</div>
+<div class="line"><a name="l16047"></a><span class="lineno">16047</span>  res = pBlock->BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l16048"></a><span class="lineno">16048</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16049"></a><span class="lineno">16049</span>  }</div>
+<div class="line"><a name="l16050"></a><span class="lineno">16050</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16051"></a><span class="lineno">16051</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16052"></a><span class="lineno">16052</span>  }</div>
+<div class="line"><a name="l16053"></a><span class="lineno">16053</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16054"></a><span class="lineno">16054</span> }</div>
+<div class="line"><a name="l16055"></a><span class="lineno">16055</span>  </div>
+<div class="line"><a name="l16056"></a><span class="lineno">16056</span> VkResult VmaAllocator_T::BindImageMemory(</div>
+<div class="line"><a name="l16057"></a><span class="lineno">16057</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l16058"></a><span class="lineno">16058</span>  VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l16059"></a><span class="lineno">16059</span>  VkImage hImage,</div>
+<div class="line"><a name="l16060"></a><span class="lineno">16060</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l16061"></a><span class="lineno">16061</span> {</div>
+<div class="line"><a name="l16062"></a><span class="lineno">16062</span>  VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l16063"></a><span class="lineno">16063</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
+<div class="line"><a name="l16064"></a><span class="lineno">16064</span>  {</div>
+<div class="line"><a name="l16065"></a><span class="lineno">16065</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16066"></a><span class="lineno">16066</span>  res = BindVulkanImage(hAllocation->GetMemory(), allocationLocalOffset, hImage, pNext);</div>
<div class="line"><a name="l16067"></a><span class="lineno">16067</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16068"></a><span class="lineno">16068</span>  }</div>
-<div class="line"><a name="l16069"></a><span class="lineno">16069</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16070"></a><span class="lineno">16070</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16071"></a><span class="lineno">16071</span>  }</div>
-<div class="line"><a name="l16072"></a><span class="lineno">16072</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16073"></a><span class="lineno">16073</span> }</div>
-<div class="line"><a name="l16074"></a><span class="lineno">16074</span>  </div>
-<div class="line"><a name="l16075"></a><span class="lineno">16075</span> <span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div>
-<div class="line"><a name="l16076"></a><span class="lineno">16076</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l16077"></a><span class="lineno">16077</span>  VkDeviceSize offset, VkDeviceSize size,</div>
-<div class="line"><a name="l16078"></a><span class="lineno">16078</span>  VMA_CACHE_OPERATION op)</div>
-<div class="line"><a name="l16079"></a><span class="lineno">16079</span> {</div>
-<div class="line"><a name="l16080"></a><span class="lineno">16080</span>  <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l16081"></a><span class="lineno">16081</span>  <span class="keywordflow">if</span>(size > 0 && IsMemoryTypeNonCoherent(memTypeIndex))</div>
-<div class="line"><a name="l16082"></a><span class="lineno">16082</span>  {</div>
-<div class="line"><a name="l16083"></a><span class="lineno">16083</span>  <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation->GetSize();</div>
-<div class="line"><a name="l16084"></a><span class="lineno">16084</span>  VMA_ASSERT(offset <= allocationSize);</div>
-<div class="line"><a name="l16085"></a><span class="lineno">16085</span>  </div>
-<div class="line"><a name="l16086"></a><span class="lineno">16086</span>  <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
-<div class="line"><a name="l16087"></a><span class="lineno">16087</span>  </div>
-<div class="line"><a name="l16088"></a><span class="lineno">16088</span>  VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
-<div class="line"><a name="l16089"></a><span class="lineno">16089</span>  memRange.memory = hAllocation->GetMemory();</div>
-<div class="line"><a name="l16090"></a><span class="lineno">16090</span>  </div>
-<div class="line"><a name="l16091"></a><span class="lineno">16091</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
-<div class="line"><a name="l16092"></a><span class="lineno">16092</span>  {</div>
-<div class="line"><a name="l16093"></a><span class="lineno">16093</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l16094"></a><span class="lineno">16094</span>  memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l16095"></a><span class="lineno">16095</span>  <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l16096"></a><span class="lineno">16096</span>  {</div>
-<div class="line"><a name="l16097"></a><span class="lineno">16097</span>  memRange.size = allocationSize - memRange.offset;</div>
-<div class="line"><a name="l16098"></a><span class="lineno">16098</span>  }</div>
-<div class="line"><a name="l16099"></a><span class="lineno">16099</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16100"></a><span class="lineno">16100</span>  {</div>
-<div class="line"><a name="l16101"></a><span class="lineno">16101</span>  VMA_ASSERT(offset + size <= allocationSize);</div>
-<div class="line"><a name="l16102"></a><span class="lineno">16102</span>  memRange.size = VMA_MIN(</div>
-<div class="line"><a name="l16103"></a><span class="lineno">16103</span>  VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l16104"></a><span class="lineno">16104</span>  allocationSize - memRange.offset);</div>
-<div class="line"><a name="l16105"></a><span class="lineno">16105</span>  }</div>
-<div class="line"><a name="l16106"></a><span class="lineno">16106</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16107"></a><span class="lineno">16107</span>  </div>
-<div class="line"><a name="l16108"></a><span class="lineno">16108</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l16109"></a><span class="lineno">16109</span>  {</div>
-<div class="line"><a name="l16110"></a><span class="lineno">16110</span>  <span class="comment">// 1. Still within this allocation.</span></div>
-<div class="line"><a name="l16111"></a><span class="lineno">16111</span>  memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l16112"></a><span class="lineno">16112</span>  <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l16113"></a><span class="lineno">16113</span>  {</div>
-<div class="line"><a name="l16114"></a><span class="lineno">16114</span>  size = allocationSize - offset;</div>
-<div class="line"><a name="l16115"></a><span class="lineno">16115</span>  }</div>
-<div class="line"><a name="l16116"></a><span class="lineno">16116</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16117"></a><span class="lineno">16117</span>  {</div>
-<div class="line"><a name="l16118"></a><span class="lineno">16118</span>  VMA_ASSERT(offset + size <= allocationSize);</div>
-<div class="line"><a name="l16119"></a><span class="lineno">16119</span>  }</div>
-<div class="line"><a name="l16120"></a><span class="lineno">16120</span>  memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div>
-<div class="line"><a name="l16121"></a><span class="lineno">16121</span>  </div>
-<div class="line"><a name="l16122"></a><span class="lineno">16122</span>  <span class="comment">// 2. Adjust to whole block.</span></div>
-<div class="line"><a name="l16123"></a><span class="lineno">16123</span>  <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation->GetOffset();</div>
-<div class="line"><a name="l16124"></a><span class="lineno">16124</span>  VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div>
-<div class="line"><a name="l16125"></a><span class="lineno">16125</span>  <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation->GetBlock()->m_pMetadata->GetSize();</div>
-<div class="line"><a name="l16126"></a><span class="lineno">16126</span>  memRange.offset += allocationOffset;</div>
-<div class="line"><a name="l16127"></a><span class="lineno">16127</span>  memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div>
-<div class="line"><a name="l16128"></a><span class="lineno">16128</span>  </div>
-<div class="line"><a name="l16129"></a><span class="lineno">16129</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16130"></a><span class="lineno">16130</span>  }</div>
-<div class="line"><a name="l16131"></a><span class="lineno">16131</span>  </div>
-<div class="line"><a name="l16132"></a><span class="lineno">16132</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16133"></a><span class="lineno">16133</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16134"></a><span class="lineno">16134</span>  }</div>
-<div class="line"><a name="l16135"></a><span class="lineno">16135</span>  </div>
-<div class="line"><a name="l16136"></a><span class="lineno">16136</span>  <span class="keywordflow">switch</span>(op)</div>
-<div class="line"><a name="l16137"></a><span class="lineno">16137</span>  {</div>
-<div class="line"><a name="l16138"></a><span class="lineno">16138</span>  <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
-<div class="line"><a name="l16139"></a><span class="lineno">16139</span>  (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &memRange);</div>
-<div class="line"><a name="l16140"></a><span class="lineno">16140</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16141"></a><span class="lineno">16141</span>  <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
-<div class="line"><a name="l16142"></a><span class="lineno">16142</span>  (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &memRange);</div>
-<div class="line"><a name="l16143"></a><span class="lineno">16143</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16144"></a><span class="lineno">16144</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16145"></a><span class="lineno">16145</span>  VMA_ASSERT(0);</div>
-<div class="line"><a name="l16146"></a><span class="lineno">16146</span>  }</div>
-<div class="line"><a name="l16147"></a><span class="lineno">16147</span>  }</div>
-<div class="line"><a name="l16148"></a><span class="lineno">16148</span>  <span class="comment">// else: Just ignore this call.</span></div>
-<div class="line"><a name="l16149"></a><span class="lineno">16149</span> }</div>
-<div class="line"><a name="l16150"></a><span class="lineno">16150</span>  </div>
-<div class="line"><a name="l16151"></a><span class="lineno">16151</span> <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="l16152"></a><span class="lineno">16152</span> {</div>
-<div class="line"><a name="l16153"></a><span class="lineno">16153</span>  VMA_ASSERT(allocation && allocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
-<div class="line"><a name="l16154"></a><span class="lineno">16154</span>  </div>
-<div class="line"><a name="l16155"></a><span class="lineno">16155</span>  <span class="keyword">const</span> uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();</div>
-<div class="line"><a name="l16156"></a><span class="lineno">16156</span>  {</div>
-<div class="line"><a name="l16157"></a><span class="lineno">16157</span>  VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l16158"></a><span class="lineno">16158</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l16159"></a><span class="lineno">16159</span>  VMA_ASSERT(pDedicatedAllocations);</div>
-<div class="line"><a name="l16160"></a><span class="lineno">16160</span>  <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted<VmaPointerLess>(*pDedicatedAllocations, allocation);</div>
-<div class="line"><a name="l16161"></a><span class="lineno">16161</span>  VMA_ASSERT(success);</div>
-<div class="line"><a name="l16162"></a><span class="lineno">16162</span>  }</div>
-<div class="line"><a name="l16163"></a><span class="lineno">16163</span>  </div>
-<div class="line"><a name="l16164"></a><span class="lineno">16164</span>  VkDeviceMemory hMemory = allocation->GetMemory();</div>
-<div class="line"><a name="l16165"></a><span class="lineno">16165</span>  </div>
-<div class="line"><a name="l16166"></a><span class="lineno">16166</span>  <span class="comment">/*</span></div>
-<div class="line"><a name="l16167"></a><span class="lineno">16167</span> <span class="comment"> There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
-<div class="line"><a name="l16168"></a><span class="lineno">16168</span> <span class="comment"> before vkFreeMemory.</span></div>
-<div class="line"><a name="l16169"></a><span class="lineno">16169</span> <span class="comment"></span> </div>
-<div class="line"><a name="l16170"></a><span class="lineno">16170</span> <span class="comment"> if(allocation->GetMappedData() != VMA_NULL)</span></div>
-<div class="line"><a name="l16171"></a><span class="lineno">16171</span> <span class="comment"> {</span></div>
-<div class="line"><a name="l16172"></a><span class="lineno">16172</span> <span class="comment"> (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
-<div class="line"><a name="l16173"></a><span class="lineno">16173</span> <span class="comment"> }</span></div>
-<div class="line"><a name="l16174"></a><span class="lineno">16174</span> <span class="comment"> */</span></div>
-<div class="line"><a name="l16175"></a><span class="lineno">16175</span>  </div>
-<div class="line"><a name="l16176"></a><span class="lineno">16176</span>  FreeVulkanMemory(memTypeIndex, allocation->GetSize(), hMemory);</div>
-<div class="line"><a name="l16177"></a><span class="lineno">16177</span>  </div>
-<div class="line"><a name="l16178"></a><span class="lineno">16178</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Freed DedicatedMemory MemoryTypeIndex=%u"</span>, memTypeIndex);</div>
-<div class="line"><a name="l16179"></a><span class="lineno">16179</span> }</div>
-<div class="line"><a name="l16180"></a><span class="lineno">16180</span>  </div>
-<div class="line"><a name="l16181"></a><span class="lineno">16181</span> uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div>
-<div class="line"><a name="l16182"></a><span class="lineno">16182</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l16183"></a><span class="lineno">16183</span>  VkBufferCreateInfo dummyBufCreateInfo;</div>
-<div class="line"><a name="l16184"></a><span class="lineno">16184</span>  VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div>
-<div class="line"><a name="l16185"></a><span class="lineno">16185</span>  </div>
-<div class="line"><a name="l16186"></a><span class="lineno">16186</span>  uint32_t memoryTypeBits = 0;</div>
-<div class="line"><a name="l16187"></a><span class="lineno">16187</span>  </div>
-<div class="line"><a name="l16188"></a><span class="lineno">16188</span>  <span class="comment">// Create buffer.</span></div>
-<div class="line"><a name="l16189"></a><span class="lineno">16189</span>  VkBuffer buf = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l16190"></a><span class="lineno">16190</span>  VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l16191"></a><span class="lineno">16191</span>  m_hDevice, &dummyBufCreateInfo, GetAllocationCallbacks(), &buf);</div>
-<div class="line"><a name="l16192"></a><span class="lineno">16192</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16193"></a><span class="lineno">16193</span>  {</div>
-<div class="line"><a name="l16194"></a><span class="lineno">16194</span>  <span class="comment">// Query for supported memory types.</span></div>
-<div class="line"><a name="l16195"></a><span class="lineno">16195</span>  VkMemoryRequirements memReq;</div>
-<div class="line"><a name="l16196"></a><span class="lineno">16196</span>  (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &memReq);</div>
-<div class="line"><a name="l16197"></a><span class="lineno">16197</span>  memoryTypeBits = memReq.memoryTypeBits;</div>
-<div class="line"><a name="l16198"></a><span class="lineno">16198</span>  </div>
-<div class="line"><a name="l16199"></a><span class="lineno">16199</span>  <span class="comment">// Destroy buffer.</span></div>
-<div class="line"><a name="l16200"></a><span class="lineno">16200</span>  (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div>
-<div class="line"><a name="l16201"></a><span class="lineno">16201</span>  }</div>
-<div class="line"><a name="l16202"></a><span class="lineno">16202</span>  </div>
-<div class="line"><a name="l16203"></a><span class="lineno">16203</span>  <span class="keywordflow">return</span> memoryTypeBits;</div>
-<div class="line"><a name="l16204"></a><span class="lineno">16204</span> }</div>
-<div class="line"><a name="l16205"></a><span class="lineno">16205</span>  </div>
-<div class="line"><a name="l16206"></a><span class="lineno">16206</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16207"></a><span class="lineno">16207</span>  </div>
-<div class="line"><a name="l16208"></a><span class="lineno">16208</span> <span class="keywordtype">void</span> VmaAllocator_T::UpdateVulkanBudget()</div>
-<div class="line"><a name="l16209"></a><span class="lineno">16209</span> {</div>
-<div class="line"><a name="l16210"></a><span class="lineno">16210</span>  VMA_ASSERT(m_UseExtMemoryBudget);</div>
+<div class="line"><a name="l16068"></a><span class="lineno">16068</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l16069"></a><span class="lineno">16069</span>  {</div>
+<div class="line"><a name="l16070"></a><span class="lineno">16070</span>  VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();</div>
+<div class="line"><a name="l16071"></a><span class="lineno">16071</span>  VMA_ASSERT(pBlock && <span class="stringliteral">"Binding image to allocation that doesn't belong to any block. Is the allocation lost?"</span>);</div>
+<div class="line"><a name="l16072"></a><span class="lineno">16072</span>  res = pBlock->BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l16073"></a><span class="lineno">16073</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16074"></a><span class="lineno">16074</span>  }</div>
+<div class="line"><a name="l16075"></a><span class="lineno">16075</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16076"></a><span class="lineno">16076</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16077"></a><span class="lineno">16077</span>  }</div>
+<div class="line"><a name="l16078"></a><span class="lineno">16078</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16079"></a><span class="lineno">16079</span> }</div>
+<div class="line"><a name="l16080"></a><span class="lineno">16080</span>  </div>
+<div class="line"><a name="l16081"></a><span class="lineno">16081</span> <span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div>
+<div class="line"><a name="l16082"></a><span class="lineno">16082</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l16083"></a><span class="lineno">16083</span>  VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l16084"></a><span class="lineno">16084</span>  VMA_CACHE_OPERATION op)</div>
+<div class="line"><a name="l16085"></a><span class="lineno">16085</span> {</div>
+<div class="line"><a name="l16086"></a><span class="lineno">16086</span>  <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l16087"></a><span class="lineno">16087</span>  <span class="keywordflow">if</span>(size > 0 && IsMemoryTypeNonCoherent(memTypeIndex))</div>
+<div class="line"><a name="l16088"></a><span class="lineno">16088</span>  {</div>
+<div class="line"><a name="l16089"></a><span class="lineno">16089</span>  <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation->GetSize();</div>
+<div class="line"><a name="l16090"></a><span class="lineno">16090</span>  VMA_ASSERT(offset <= allocationSize);</div>
+<div class="line"><a name="l16091"></a><span class="lineno">16091</span>  </div>
+<div class="line"><a name="l16092"></a><span class="lineno">16092</span>  <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l16093"></a><span class="lineno">16093</span>  </div>
+<div class="line"><a name="l16094"></a><span class="lineno">16094</span>  VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
+<div class="line"><a name="l16095"></a><span class="lineno">16095</span>  memRange.memory = hAllocation->GetMemory();</div>
+<div class="line"><a name="l16096"></a><span class="lineno">16096</span>  </div>
+<div class="line"><a name="l16097"></a><span class="lineno">16097</span>  <span class="keywordflow">switch</span>(hAllocation->GetType())</div>
+<div class="line"><a name="l16098"></a><span class="lineno">16098</span>  {</div>
+<div class="line"><a name="l16099"></a><span class="lineno">16099</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16100"></a><span class="lineno">16100</span>  memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l16101"></a><span class="lineno">16101</span>  <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l16102"></a><span class="lineno">16102</span>  {</div>
+<div class="line"><a name="l16103"></a><span class="lineno">16103</span>  memRange.size = allocationSize - memRange.offset;</div>
+<div class="line"><a name="l16104"></a><span class="lineno">16104</span>  }</div>
+<div class="line"><a name="l16105"></a><span class="lineno">16105</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16106"></a><span class="lineno">16106</span>  {</div>
+<div class="line"><a name="l16107"></a><span class="lineno">16107</span>  VMA_ASSERT(offset + size <= allocationSize);</div>
+<div class="line"><a name="l16108"></a><span class="lineno">16108</span>  memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l16109"></a><span class="lineno">16109</span>  VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l16110"></a><span class="lineno">16110</span>  allocationSize - memRange.offset);</div>
+<div class="line"><a name="l16111"></a><span class="lineno">16111</span>  }</div>
+<div class="line"><a name="l16112"></a><span class="lineno">16112</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16113"></a><span class="lineno">16113</span>  </div>
+<div class="line"><a name="l16114"></a><span class="lineno">16114</span>  <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l16115"></a><span class="lineno">16115</span>  {</div>
+<div class="line"><a name="l16116"></a><span class="lineno">16116</span>  <span class="comment">// 1. Still within this allocation.</span></div>
+<div class="line"><a name="l16117"></a><span class="lineno">16117</span>  memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l16118"></a><span class="lineno">16118</span>  <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l16119"></a><span class="lineno">16119</span>  {</div>
+<div class="line"><a name="l16120"></a><span class="lineno">16120</span>  size = allocationSize - offset;</div>
+<div class="line"><a name="l16121"></a><span class="lineno">16121</span>  }</div>
+<div class="line"><a name="l16122"></a><span class="lineno">16122</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16123"></a><span class="lineno">16123</span>  {</div>
+<div class="line"><a name="l16124"></a><span class="lineno">16124</span>  VMA_ASSERT(offset + size <= allocationSize);</div>
+<div class="line"><a name="l16125"></a><span class="lineno">16125</span>  }</div>
+<div class="line"><a name="l16126"></a><span class="lineno">16126</span>  memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div>
+<div class="line"><a name="l16127"></a><span class="lineno">16127</span>  </div>
+<div class="line"><a name="l16128"></a><span class="lineno">16128</span>  <span class="comment">// 2. Adjust to whole block.</span></div>
+<div class="line"><a name="l16129"></a><span class="lineno">16129</span>  <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation->GetOffset();</div>
+<div class="line"><a name="l16130"></a><span class="lineno">16130</span>  VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div>
+<div class="line"><a name="l16131"></a><span class="lineno">16131</span>  <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation->GetBlock()->m_pMetadata->GetSize();</div>
+<div class="line"><a name="l16132"></a><span class="lineno">16132</span>  memRange.offset += allocationOffset;</div>
+<div class="line"><a name="l16133"></a><span class="lineno">16133</span>  memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div>
+<div class="line"><a name="l16134"></a><span class="lineno">16134</span>  </div>
+<div class="line"><a name="l16135"></a><span class="lineno">16135</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16136"></a><span class="lineno">16136</span>  }</div>
+<div class="line"><a name="l16137"></a><span class="lineno">16137</span>  </div>
+<div class="line"><a name="l16138"></a><span class="lineno">16138</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16139"></a><span class="lineno">16139</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16140"></a><span class="lineno">16140</span>  }</div>
+<div class="line"><a name="l16141"></a><span class="lineno">16141</span>  </div>
+<div class="line"><a name="l16142"></a><span class="lineno">16142</span>  <span class="keywordflow">switch</span>(op)</div>
+<div class="line"><a name="l16143"></a><span class="lineno">16143</span>  {</div>
+<div class="line"><a name="l16144"></a><span class="lineno">16144</span>  <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
+<div class="line"><a name="l16145"></a><span class="lineno">16145</span>  (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &memRange);</div>
+<div class="line"><a name="l16146"></a><span class="lineno">16146</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16147"></a><span class="lineno">16147</span>  <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
+<div class="line"><a name="l16148"></a><span class="lineno">16148</span>  (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &memRange);</div>
+<div class="line"><a name="l16149"></a><span class="lineno">16149</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16150"></a><span class="lineno">16150</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16151"></a><span class="lineno">16151</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16152"></a><span class="lineno">16152</span>  }</div>
+<div class="line"><a name="l16153"></a><span class="lineno">16153</span>  }</div>
+<div class="line"><a name="l16154"></a><span class="lineno">16154</span>  <span class="comment">// else: Just ignore this call.</span></div>
+<div class="line"><a name="l16155"></a><span class="lineno">16155</span> }</div>
+<div class="line"><a name="l16156"></a><span class="lineno">16156</span>  </div>
+<div class="line"><a name="l16157"></a><span class="lineno">16157</span> <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="l16158"></a><span class="lineno">16158</span> {</div>
+<div class="line"><a name="l16159"></a><span class="lineno">16159</span>  VMA_ASSERT(allocation && allocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l16160"></a><span class="lineno">16160</span>  </div>
+<div class="line"><a name="l16161"></a><span class="lineno">16161</span>  <span class="keyword">const</span> uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();</div>
+<div class="line"><a name="l16162"></a><span class="lineno">16162</span>  {</div>
+<div class="line"><a name="l16163"></a><span class="lineno">16163</span>  VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l16164"></a><span class="lineno">16164</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l16165"></a><span class="lineno">16165</span>  VMA_ASSERT(pDedicatedAllocations);</div>
+<div class="line"><a name="l16166"></a><span class="lineno">16166</span>  <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted<VmaPointerLess>(*pDedicatedAllocations, allocation);</div>
+<div class="line"><a name="l16167"></a><span class="lineno">16167</span>  VMA_ASSERT(success);</div>
+<div class="line"><a name="l16168"></a><span class="lineno">16168</span>  }</div>
+<div class="line"><a name="l16169"></a><span class="lineno">16169</span>  </div>
+<div class="line"><a name="l16170"></a><span class="lineno">16170</span>  VkDeviceMemory hMemory = allocation->GetMemory();</div>
+<div class="line"><a name="l16171"></a><span class="lineno">16171</span>  </div>
+<div class="line"><a name="l16172"></a><span class="lineno">16172</span>  <span class="comment">/*</span></div>
+<div class="line"><a name="l16173"></a><span class="lineno">16173</span> <span class="comment"> There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
+<div class="line"><a name="l16174"></a><span class="lineno">16174</span> <span class="comment"> before vkFreeMemory.</span></div>
+<div class="line"><a name="l16175"></a><span class="lineno">16175</span> <span class="comment"></span> </div>
+<div class="line"><a name="l16176"></a><span class="lineno">16176</span> <span class="comment"> if(allocation->GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l16177"></a><span class="lineno">16177</span> <span class="comment"> {</span></div>
+<div class="line"><a name="l16178"></a><span class="lineno">16178</span> <span class="comment"> (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l16179"></a><span class="lineno">16179</span> <span class="comment"> }</span></div>
+<div class="line"><a name="l16180"></a><span class="lineno">16180</span> <span class="comment"> */</span></div>
+<div class="line"><a name="l16181"></a><span class="lineno">16181</span>  </div>
+<div class="line"><a name="l16182"></a><span class="lineno">16182</span>  FreeVulkanMemory(memTypeIndex, allocation->GetSize(), hMemory);</div>
+<div class="line"><a name="l16183"></a><span class="lineno">16183</span>  </div>
+<div class="line"><a name="l16184"></a><span class="lineno">16184</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Freed DedicatedMemory MemoryTypeIndex=%u"</span>, memTypeIndex);</div>
+<div class="line"><a name="l16185"></a><span class="lineno">16185</span> }</div>
+<div class="line"><a name="l16186"></a><span class="lineno">16186</span>  </div>
+<div class="line"><a name="l16187"></a><span class="lineno">16187</span> uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div>
+<div class="line"><a name="l16188"></a><span class="lineno">16188</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l16189"></a><span class="lineno">16189</span>  VkBufferCreateInfo dummyBufCreateInfo;</div>
+<div class="line"><a name="l16190"></a><span class="lineno">16190</span>  VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div>
+<div class="line"><a name="l16191"></a><span class="lineno">16191</span>  </div>
+<div class="line"><a name="l16192"></a><span class="lineno">16192</span>  uint32_t memoryTypeBits = 0;</div>
+<div class="line"><a name="l16193"></a><span class="lineno">16193</span>  </div>
+<div class="line"><a name="l16194"></a><span class="lineno">16194</span>  <span class="comment">// Create buffer.</span></div>
+<div class="line"><a name="l16195"></a><span class="lineno">16195</span>  VkBuffer buf = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16196"></a><span class="lineno">16196</span>  VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l16197"></a><span class="lineno">16197</span>  m_hDevice, &dummyBufCreateInfo, GetAllocationCallbacks(), &buf);</div>
+<div class="line"><a name="l16198"></a><span class="lineno">16198</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16199"></a><span class="lineno">16199</span>  {</div>
+<div class="line"><a name="l16200"></a><span class="lineno">16200</span>  <span class="comment">// Query for supported memory types.</span></div>
+<div class="line"><a name="l16201"></a><span class="lineno">16201</span>  VkMemoryRequirements memReq;</div>
+<div class="line"><a name="l16202"></a><span class="lineno">16202</span>  (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &memReq);</div>
+<div class="line"><a name="l16203"></a><span class="lineno">16203</span>  memoryTypeBits = memReq.memoryTypeBits;</div>
+<div class="line"><a name="l16204"></a><span class="lineno">16204</span>  </div>
+<div class="line"><a name="l16205"></a><span class="lineno">16205</span>  <span class="comment">// Destroy buffer.</span></div>
+<div class="line"><a name="l16206"></a><span class="lineno">16206</span>  (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div>
+<div class="line"><a name="l16207"></a><span class="lineno">16207</span>  }</div>
+<div class="line"><a name="l16208"></a><span class="lineno">16208</span>  </div>
+<div class="line"><a name="l16209"></a><span class="lineno">16209</span>  <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l16210"></a><span class="lineno">16210</span> }</div>
<div class="line"><a name="l16211"></a><span class="lineno">16211</span>  </div>
-<div class="line"><a name="l16212"></a><span class="lineno">16212</span>  VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };</div>
+<div class="line"><a name="l16212"></a><span class="lineno">16212</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
<div class="line"><a name="l16213"></a><span class="lineno">16213</span>  </div>
-<div class="line"><a name="l16214"></a><span class="lineno">16214</span>  VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };</div>
-<div class="line"><a name="l16215"></a><span class="lineno">16215</span>  memProps.pNext = &budgetProps;</div>
-<div class="line"><a name="l16216"></a><span class="lineno">16216</span>  </div>
-<div class="line"><a name="l16217"></a><span class="lineno">16217</span>  GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &memProps);</div>
-<div class="line"><a name="l16218"></a><span class="lineno">16218</span>  </div>
-<div class="line"><a name="l16219"></a><span class="lineno">16219</span>  {</div>
-<div class="line"><a name="l16220"></a><span class="lineno">16220</span>  VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);</div>
-<div class="line"><a name="l16221"></a><span class="lineno">16221</span>  </div>
-<div class="line"><a name="l16222"></a><span class="lineno">16222</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l16223"></a><span class="lineno">16223</span>  {</div>
-<div class="line"><a name="l16224"></a><span class="lineno">16224</span>  m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];</div>
-<div class="line"><a name="l16225"></a><span class="lineno">16225</span>  m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];</div>
-<div class="line"><a name="l16226"></a><span class="lineno">16226</span>  m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();</div>
-<div class="line"><a name="l16227"></a><span class="lineno">16227</span>  }</div>
-<div class="line"><a name="l16228"></a><span class="lineno">16228</span>  m_Budget.m_OperationsSinceBudgetFetch = 0;</div>
-<div class="line"><a name="l16229"></a><span class="lineno">16229</span>  }</div>
-<div class="line"><a name="l16230"></a><span class="lineno">16230</span> }</div>
-<div class="line"><a name="l16231"></a><span class="lineno">16231</span>  </div>
-<div class="line"><a name="l16232"></a><span class="lineno">16232</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16233"></a><span class="lineno">16233</span>  </div>
-<div class="line"><a name="l16234"></a><span class="lineno">16234</span> <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="l16235"></a><span class="lineno">16235</span> {</div>
-<div class="line"><a name="l16236"></a><span class="lineno">16236</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &&</div>
-<div class="line"><a name="l16237"></a><span class="lineno">16237</span>  !hAllocation->CanBecomeLost() &&</div>
-<div class="line"><a name="l16238"></a><span class="lineno">16238</span>  (m_MemProps.memoryTypes[hAllocation->GetMemoryTypeIndex()].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
-<div class="line"><a name="l16239"></a><span class="lineno">16239</span>  {</div>
-<div class="line"><a name="l16240"></a><span class="lineno">16240</span>  <span class="keywordtype">void</span>* pData = VMA_NULL;</div>
-<div class="line"><a name="l16241"></a><span class="lineno">16241</span>  VkResult res = Map(hAllocation, &pData);</div>
-<div class="line"><a name="l16242"></a><span class="lineno">16242</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16243"></a><span class="lineno">16243</span>  {</div>
-<div class="line"><a name="l16244"></a><span class="lineno">16244</span>  memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation->GetSize());</div>
-<div class="line"><a name="l16245"></a><span class="lineno">16245</span>  FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div>
-<div class="line"><a name="l16246"></a><span class="lineno">16246</span>  Unmap(hAllocation);</div>
-<div class="line"><a name="l16247"></a><span class="lineno">16247</span>  }</div>
-<div class="line"><a name="l16248"></a><span class="lineno">16248</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16214"></a><span class="lineno">16214</span> <span class="keywordtype">void</span> VmaAllocator_T::UpdateVulkanBudget()</div>
+<div class="line"><a name="l16215"></a><span class="lineno">16215</span> {</div>
+<div class="line"><a name="l16216"></a><span class="lineno">16216</span>  VMA_ASSERT(m_UseExtMemoryBudget);</div>
+<div class="line"><a name="l16217"></a><span class="lineno">16217</span>  </div>
+<div class="line"><a name="l16218"></a><span class="lineno">16218</span>  VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };</div>
+<div class="line"><a name="l16219"></a><span class="lineno">16219</span>  </div>
+<div class="line"><a name="l16220"></a><span class="lineno">16220</span>  VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };</div>
+<div class="line"><a name="l16221"></a><span class="lineno">16221</span>  memProps.pNext = &budgetProps;</div>
+<div class="line"><a name="l16222"></a><span class="lineno">16222</span>  </div>
+<div class="line"><a name="l16223"></a><span class="lineno">16223</span>  GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &memProps);</div>
+<div class="line"><a name="l16224"></a><span class="lineno">16224</span>  </div>
+<div class="line"><a name="l16225"></a><span class="lineno">16225</span>  {</div>
+<div class="line"><a name="l16226"></a><span class="lineno">16226</span>  VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l16227"></a><span class="lineno">16227</span>  </div>
+<div class="line"><a name="l16228"></a><span class="lineno">16228</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l16229"></a><span class="lineno">16229</span>  {</div>
+<div class="line"><a name="l16230"></a><span class="lineno">16230</span>  m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];</div>
+<div class="line"><a name="l16231"></a><span class="lineno">16231</span>  m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];</div>
+<div class="line"><a name="l16232"></a><span class="lineno">16232</span>  m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();</div>
+<div class="line"><a name="l16233"></a><span class="lineno">16233</span>  }</div>
+<div class="line"><a name="l16234"></a><span class="lineno">16234</span>  m_Budget.m_OperationsSinceBudgetFetch = 0;</div>
+<div class="line"><a name="l16235"></a><span class="lineno">16235</span>  }</div>
+<div class="line"><a name="l16236"></a><span class="lineno">16236</span> }</div>
+<div class="line"><a name="l16237"></a><span class="lineno">16237</span>  </div>
+<div class="line"><a name="l16238"></a><span class="lineno">16238</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16239"></a><span class="lineno">16239</span>  </div>
+<div class="line"><a name="l16240"></a><span class="lineno">16240</span> <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="l16241"></a><span class="lineno">16241</span> {</div>
+<div class="line"><a name="l16242"></a><span class="lineno">16242</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &&</div>
+<div class="line"><a name="l16243"></a><span class="lineno">16243</span>  !hAllocation->CanBecomeLost() &&</div>
+<div class="line"><a name="l16244"></a><span class="lineno">16244</span>  (m_MemProps.memoryTypes[hAllocation->GetMemoryTypeIndex()].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l16245"></a><span class="lineno">16245</span>  {</div>
+<div class="line"><a name="l16246"></a><span class="lineno">16246</span>  <span class="keywordtype">void</span>* pData = VMA_NULL;</div>
+<div class="line"><a name="l16247"></a><span class="lineno">16247</span>  VkResult res = Map(hAllocation, &pData);</div>
+<div class="line"><a name="l16248"></a><span class="lineno">16248</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
<div class="line"><a name="l16249"></a><span class="lineno">16249</span>  {</div>
-<div class="line"><a name="l16250"></a><span class="lineno">16250</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn't map memory to fill allocation."</span>);</div>
-<div class="line"><a name="l16251"></a><span class="lineno">16251</span>  }</div>
-<div class="line"><a name="l16252"></a><span class="lineno">16252</span>  }</div>
-<div class="line"><a name="l16253"></a><span class="lineno">16253</span> }</div>
-<div class="line"><a name="l16254"></a><span class="lineno">16254</span>  </div>
-<div class="line"><a name="l16255"></a><span class="lineno">16255</span> uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div>
-<div class="line"><a name="l16256"></a><span class="lineno">16256</span> {</div>
-<div class="line"><a name="l16257"></a><span class="lineno">16257</span>  uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div>
-<div class="line"><a name="l16258"></a><span class="lineno">16258</span>  <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div>
-<div class="line"><a name="l16259"></a><span class="lineno">16259</span>  {</div>
-<div class="line"><a name="l16260"></a><span class="lineno">16260</span>  memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div>
-<div class="line"><a name="l16261"></a><span class="lineno">16261</span>  m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div>
-<div class="line"><a name="l16262"></a><span class="lineno">16262</span>  }</div>
-<div class="line"><a name="l16263"></a><span class="lineno">16263</span>  <span class="keywordflow">return</span> memoryTypeBits;</div>
-<div class="line"><a name="l16264"></a><span class="lineno">16264</span> }</div>
-<div class="line"><a name="l16265"></a><span class="lineno">16265</span>  </div>
-<div class="line"><a name="l16266"></a><span class="lineno">16266</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16267"></a><span class="lineno">16267</span>  </div>
-<div class="line"><a name="l16268"></a><span class="lineno">16268</span> <span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter& json)</div>
-<div class="line"><a name="l16269"></a><span class="lineno">16269</span> {</div>
-<div class="line"><a name="l16270"></a><span class="lineno">16270</span>  <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16271"></a><span class="lineno">16271</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l16272"></a><span class="lineno">16272</span>  {</div>
-<div class="line"><a name="l16273"></a><span class="lineno">16273</span>  VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l16274"></a><span class="lineno">16274</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l16275"></a><span class="lineno">16275</span>  VMA_ASSERT(pDedicatedAllocVector);</div>
-<div class="line"><a name="l16276"></a><span class="lineno">16276</span>  <span class="keywordflow">if</span>(pDedicatedAllocVector->empty() == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l16277"></a><span class="lineno">16277</span>  {</div>
-<div class="line"><a name="l16278"></a><span class="lineno">16278</span>  <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l16279"></a><span class="lineno">16279</span>  {</div>
-<div class="line"><a name="l16280"></a><span class="lineno">16280</span>  dedicatedAllocationsStarted = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l16281"></a><span class="lineno">16281</span>  json.WriteString(<span class="stringliteral">"DedicatedAllocations"</span>);</div>
-<div class="line"><a name="l16282"></a><span class="lineno">16282</span>  json.BeginObject();</div>
-<div class="line"><a name="l16283"></a><span class="lineno">16283</span>  }</div>
-<div class="line"><a name="l16284"></a><span class="lineno">16284</span>  </div>
-<div class="line"><a name="l16285"></a><span class="lineno">16285</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
-<div class="line"><a name="l16286"></a><span class="lineno">16286</span>  json.ContinueString(memTypeIndex);</div>
-<div class="line"><a name="l16287"></a><span class="lineno">16287</span>  json.EndString();</div>
-<div class="line"><a name="l16288"></a><span class="lineno">16288</span>  </div>
-<div class="line"><a name="l16289"></a><span class="lineno">16289</span>  json.BeginArray();</div>
+<div class="line"><a name="l16250"></a><span class="lineno">16250</span>  memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation->GetSize());</div>
+<div class="line"><a name="l16251"></a><span class="lineno">16251</span>  FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l16252"></a><span class="lineno">16252</span>  Unmap(hAllocation);</div>
+<div class="line"><a name="l16253"></a><span class="lineno">16253</span>  }</div>
+<div class="line"><a name="l16254"></a><span class="lineno">16254</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16255"></a><span class="lineno">16255</span>  {</div>
+<div class="line"><a name="l16256"></a><span class="lineno">16256</span>  VMA_ASSERT(0 && <span class="stringliteral">"VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn't map memory to fill allocation."</span>);</div>
+<div class="line"><a name="l16257"></a><span class="lineno">16257</span>  }</div>
+<div class="line"><a name="l16258"></a><span class="lineno">16258</span>  }</div>
+<div class="line"><a name="l16259"></a><span class="lineno">16259</span> }</div>
+<div class="line"><a name="l16260"></a><span class="lineno">16260</span>  </div>
+<div class="line"><a name="l16261"></a><span class="lineno">16261</span> uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div>
+<div class="line"><a name="l16262"></a><span class="lineno">16262</span> {</div>
+<div class="line"><a name="l16263"></a><span class="lineno">16263</span>  uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div>
+<div class="line"><a name="l16264"></a><span class="lineno">16264</span>  <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div>
+<div class="line"><a name="l16265"></a><span class="lineno">16265</span>  {</div>
+<div class="line"><a name="l16266"></a><span class="lineno">16266</span>  memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div>
+<div class="line"><a name="l16267"></a><span class="lineno">16267</span>  m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div>
+<div class="line"><a name="l16268"></a><span class="lineno">16268</span>  }</div>
+<div class="line"><a name="l16269"></a><span class="lineno">16269</span>  <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l16270"></a><span class="lineno">16270</span> }</div>
+<div class="line"><a name="l16271"></a><span class="lineno">16271</span>  </div>
+<div class="line"><a name="l16272"></a><span class="lineno">16272</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16273"></a><span class="lineno">16273</span>  </div>
+<div class="line"><a name="l16274"></a><span class="lineno">16274</span> <span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter& json)</div>
+<div class="line"><a name="l16275"></a><span class="lineno">16275</span> {</div>
+<div class="line"><a name="l16276"></a><span class="lineno">16276</span>  <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16277"></a><span class="lineno">16277</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l16278"></a><span class="lineno">16278</span>  {</div>
+<div class="line"><a name="l16279"></a><span class="lineno">16279</span>  VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l16280"></a><span class="lineno">16280</span>  AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l16281"></a><span class="lineno">16281</span>  VMA_ASSERT(pDedicatedAllocVector);</div>
+<div class="line"><a name="l16282"></a><span class="lineno">16282</span>  <span class="keywordflow">if</span>(pDedicatedAllocVector->empty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16283"></a><span class="lineno">16283</span>  {</div>
+<div class="line"><a name="l16284"></a><span class="lineno">16284</span>  <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16285"></a><span class="lineno">16285</span>  {</div>
+<div class="line"><a name="l16286"></a><span class="lineno">16286</span>  dedicatedAllocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l16287"></a><span class="lineno">16287</span>  json.WriteString(<span class="stringliteral">"DedicatedAllocations"</span>);</div>
+<div class="line"><a name="l16288"></a><span class="lineno">16288</span>  json.BeginObject();</div>
+<div class="line"><a name="l16289"></a><span class="lineno">16289</span>  }</div>
<div class="line"><a name="l16290"></a><span class="lineno">16290</span>  </div>
-<div class="line"><a name="l16291"></a><span class="lineno">16291</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < pDedicatedAllocVector->size(); ++i)</div>
-<div class="line"><a name="l16292"></a><span class="lineno">16292</span>  {</div>
-<div class="line"><a name="l16293"></a><span class="lineno">16293</span>  json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l16294"></a><span class="lineno">16294</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div>
-<div class="line"><a name="l16295"></a><span class="lineno">16295</span>  hAlloc->PrintParameters(json);</div>
-<div class="line"><a name="l16296"></a><span class="lineno">16296</span>  json.EndObject();</div>
-<div class="line"><a name="l16297"></a><span class="lineno">16297</span>  }</div>
-<div class="line"><a name="l16298"></a><span class="lineno">16298</span>  </div>
-<div class="line"><a name="l16299"></a><span class="lineno">16299</span>  json.EndArray();</div>
-<div class="line"><a name="l16300"></a><span class="lineno">16300</span>  }</div>
-<div class="line"><a name="l16301"></a><span class="lineno">16301</span>  }</div>
-<div class="line"><a name="l16302"></a><span class="lineno">16302</span>  <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div>
-<div class="line"><a name="l16303"></a><span class="lineno">16303</span>  {</div>
-<div class="line"><a name="l16304"></a><span class="lineno">16304</span>  json.EndObject();</div>
-<div class="line"><a name="l16305"></a><span class="lineno">16305</span>  }</div>
-<div class="line"><a name="l16306"></a><span class="lineno">16306</span>  </div>
-<div class="line"><a name="l16307"></a><span class="lineno">16307</span>  {</div>
-<div class="line"><a name="l16308"></a><span class="lineno">16308</span>  <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16309"></a><span class="lineno">16309</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l16310"></a><span class="lineno">16310</span>  {</div>
-<div class="line"><a name="l16311"></a><span class="lineno">16311</span>  <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]->IsEmpty() == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l16312"></a><span class="lineno">16312</span>  {</div>
-<div class="line"><a name="l16313"></a><span class="lineno">16313</span>  <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l16314"></a><span class="lineno">16314</span>  {</div>
-<div class="line"><a name="l16315"></a><span class="lineno">16315</span>  allocationsStarted = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l16316"></a><span class="lineno">16316</span>  json.WriteString(<span class="stringliteral">"DefaultPools"</span>);</div>
-<div class="line"><a name="l16317"></a><span class="lineno">16317</span>  json.BeginObject();</div>
-<div class="line"><a name="l16318"></a><span class="lineno">16318</span>  }</div>
-<div class="line"><a name="l16319"></a><span class="lineno">16319</span>  </div>
-<div class="line"><a name="l16320"></a><span class="lineno">16320</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
-<div class="line"><a name="l16321"></a><span class="lineno">16321</span>  json.ContinueString(memTypeIndex);</div>
-<div class="line"><a name="l16322"></a><span class="lineno">16322</span>  json.EndString();</div>
-<div class="line"><a name="l16323"></a><span class="lineno">16323</span>  </div>
-<div class="line"><a name="l16324"></a><span class="lineno">16324</span>  m_pBlockVectors[memTypeIndex]->PrintDetailedMap(json);</div>
-<div class="line"><a name="l16325"></a><span class="lineno">16325</span>  }</div>
-<div class="line"><a name="l16326"></a><span class="lineno">16326</span>  }</div>
-<div class="line"><a name="l16327"></a><span class="lineno">16327</span>  <span class="keywordflow">if</span>(allocationsStarted)</div>
-<div class="line"><a name="l16328"></a><span class="lineno">16328</span>  {</div>
-<div class="line"><a name="l16329"></a><span class="lineno">16329</span>  json.EndObject();</div>
-<div class="line"><a name="l16330"></a><span class="lineno">16330</span>  }</div>
-<div class="line"><a name="l16331"></a><span class="lineno">16331</span>  }</div>
-<div class="line"><a name="l16332"></a><span class="lineno">16332</span>  </div>
-<div class="line"><a name="l16333"></a><span class="lineno">16333</span>  <span class="comment">// Custom pools</span></div>
-<div class="line"><a name="l16334"></a><span class="lineno">16334</span>  {</div>
-<div class="line"><a name="l16335"></a><span class="lineno">16335</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l16336"></a><span class="lineno">16336</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div>
-<div class="line"><a name="l16337"></a><span class="lineno">16337</span>  <span class="keywordflow">if</span>(poolCount > 0)</div>
-<div class="line"><a name="l16338"></a><span class="lineno">16338</span>  {</div>
-<div class="line"><a name="l16339"></a><span class="lineno">16339</span>  json.WriteString(<span class="stringliteral">"Pools"</span>);</div>
-<div class="line"><a name="l16340"></a><span class="lineno">16340</span>  json.BeginObject();</div>
-<div class="line"><a name="l16341"></a><span class="lineno">16341</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex < poolCount; ++poolIndex)</div>
-<div class="line"><a name="l16342"></a><span class="lineno">16342</span>  {</div>
-<div class="line"><a name="l16343"></a><span class="lineno">16343</span>  json.BeginString();</div>
-<div class="line"><a name="l16344"></a><span class="lineno">16344</span>  json.ContinueString(m_Pools[poolIndex]->GetId());</div>
-<div class="line"><a name="l16345"></a><span class="lineno">16345</span>  json.EndString();</div>
-<div class="line"><a name="l16346"></a><span class="lineno">16346</span>  </div>
-<div class="line"><a name="l16347"></a><span class="lineno">16347</span>  m_Pools[poolIndex]->m_BlockVector.PrintDetailedMap(json);</div>
-<div class="line"><a name="l16348"></a><span class="lineno">16348</span>  }</div>
-<div class="line"><a name="l16349"></a><span class="lineno">16349</span>  json.EndObject();</div>
-<div class="line"><a name="l16350"></a><span class="lineno">16350</span>  }</div>
-<div class="line"><a name="l16351"></a><span class="lineno">16351</span>  }</div>
-<div class="line"><a name="l16352"></a><span class="lineno">16352</span> }</div>
-<div class="line"><a name="l16353"></a><span class="lineno">16353</span>  </div>
-<div class="line"><a name="l16354"></a><span class="lineno">16354</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16355"></a><span class="lineno">16355</span>  </div>
-<div class="line"><a name="l16357"></a><span class="lineno">16357</span> <span class="comment">// Public interface</span></div>
-<div class="line"><a name="l16358"></a><span class="lineno">16358</span>  </div>
-<div class="line"><a name="l16359"></a><span class="lineno">16359</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
-<div class="line"><a name="l16360"></a><span class="lineno">16360</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l16361"></a><span class="lineno">16361</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div>
-<div class="line"><a name="l16362"></a><span class="lineno">16362</span> {</div>
-<div class="line"><a name="l16363"></a><span class="lineno">16363</span>  VMA_ASSERT(pCreateInfo && pAllocator);</div>
-<div class="line"><a name="l16364"></a><span class="lineno">16364</span>  VMA_ASSERT(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> == 0 ||</div>
-<div class="line"><a name="l16365"></a><span class="lineno">16365</span>  (VK_VERSION_MAJOR(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) == 1 && VK_VERSION_MINOR(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) <= 1));</div>
-<div class="line"><a name="l16366"></a><span class="lineno">16366</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateAllocator"</span>);</div>
-<div class="line"><a name="l16367"></a><span class="lineno">16367</span>  *pAllocator = vma_new(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div>
-<div class="line"><a name="l16368"></a><span class="lineno">16368</span>  <span class="keywordflow">return</span> (*pAllocator)->Init(pCreateInfo);</div>
-<div class="line"><a name="l16369"></a><span class="lineno">16369</span> }</div>
-<div class="line"><a name="l16370"></a><span class="lineno">16370</span>  </div>
-<div class="line"><a name="l16371"></a><span class="lineno">16371</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
-<div class="line"><a name="l16372"></a><span class="lineno">16372</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
-<div class="line"><a name="l16373"></a><span class="lineno">16373</span> {</div>
-<div class="line"><a name="l16374"></a><span class="lineno">16374</span>  <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16375"></a><span class="lineno">16375</span>  {</div>
-<div class="line"><a name="l16376"></a><span class="lineno">16376</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyAllocator"</span>);</div>
-<div class="line"><a name="l16377"></a><span class="lineno">16377</span>  VkAllocationCallbacks allocationCallbacks = allocator->m_AllocationCallbacks;</div>
-<div class="line"><a name="l16378"></a><span class="lineno">16378</span>  vma_delete(&allocationCallbacks, allocator);</div>
-<div class="line"><a name="l16379"></a><span class="lineno">16379</span>  }</div>
-<div class="line"><a name="l16380"></a><span class="lineno">16380</span> }</div>
-<div class="line"><a name="l16381"></a><span class="lineno">16381</span>  </div>
-<div class="line"><a name="l16382"></a><span class="lineno">16382</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
-<div class="line"><a name="l16383"></a><span class="lineno">16383</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16384"></a><span class="lineno">16384</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div>
-<div class="line"><a name="l16385"></a><span class="lineno">16385</span> {</div>
-<div class="line"><a name="l16386"></a><span class="lineno">16386</span>  VMA_ASSERT(allocator && ppPhysicalDeviceProperties);</div>
-<div class="line"><a name="l16387"></a><span class="lineno">16387</span>  *ppPhysicalDeviceProperties = &allocator->m_PhysicalDeviceProperties;</div>
-<div class="line"><a name="l16388"></a><span class="lineno">16388</span> }</div>
-<div class="line"><a name="l16389"></a><span class="lineno">16389</span>  </div>
-<div class="line"><a name="l16390"></a><span class="lineno">16390</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
-<div class="line"><a name="l16391"></a><span class="lineno">16391</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16392"></a><span class="lineno">16392</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div>
-<div class="line"><a name="l16393"></a><span class="lineno">16393</span> {</div>
-<div class="line"><a name="l16394"></a><span class="lineno">16394</span>  VMA_ASSERT(allocator && ppPhysicalDeviceMemoryProperties);</div>
-<div class="line"><a name="l16395"></a><span class="lineno">16395</span>  *ppPhysicalDeviceMemoryProperties = &allocator->m_MemProps;</div>
-<div class="line"><a name="l16396"></a><span class="lineno">16396</span> }</div>
-<div class="line"><a name="l16397"></a><span class="lineno">16397</span>  </div>
-<div class="line"><a name="l16398"></a><span class="lineno">16398</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
-<div class="line"><a name="l16399"></a><span class="lineno">16399</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16400"></a><span class="lineno">16400</span>  uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l16401"></a><span class="lineno">16401</span>  VkMemoryPropertyFlags* pFlags)</div>
-<div class="line"><a name="l16402"></a><span class="lineno">16402</span> {</div>
-<div class="line"><a name="l16403"></a><span class="lineno">16403</span>  VMA_ASSERT(allocator && pFlags);</div>
-<div class="line"><a name="l16404"></a><span class="lineno">16404</span>  VMA_ASSERT(memoryTypeIndex < allocator->GetMemoryTypeCount());</div>
-<div class="line"><a name="l16405"></a><span class="lineno">16405</span>  *pFlags = allocator->m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l16406"></a><span class="lineno">16406</span> }</div>
-<div class="line"><a name="l16407"></a><span class="lineno">16407</span>  </div>
-<div class="line"><a name="l16408"></a><span class="lineno">16408</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
-<div class="line"><a name="l16409"></a><span class="lineno">16409</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16410"></a><span class="lineno">16410</span>  uint32_t frameIndex)</div>
-<div class="line"><a name="l16411"></a><span class="lineno">16411</span> {</div>
-<div class="line"><a name="l16412"></a><span class="lineno">16412</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l16413"></a><span class="lineno">16413</span>  VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l16414"></a><span class="lineno">16414</span>  </div>
-<div class="line"><a name="l16415"></a><span class="lineno">16415</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16416"></a><span class="lineno">16416</span>  </div>
-<div class="line"><a name="l16417"></a><span class="lineno">16417</span>  allocator->SetCurrentFrameIndex(frameIndex);</div>
-<div class="line"><a name="l16418"></a><span class="lineno">16418</span> }</div>
-<div class="line"><a name="l16419"></a><span class="lineno">16419</span>  </div>
-<div class="line"><a name="l16420"></a><span class="lineno">16420</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
-<div class="line"><a name="l16421"></a><span class="lineno">16421</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16422"></a><span class="lineno">16422</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
-<div class="line"><a name="l16423"></a><span class="lineno">16423</span> {</div>
-<div class="line"><a name="l16424"></a><span class="lineno">16424</span>  VMA_ASSERT(allocator && pStats);</div>
-<div class="line"><a name="l16425"></a><span class="lineno">16425</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16426"></a><span class="lineno">16426</span>  allocator->CalculateStats(pStats);</div>
-<div class="line"><a name="l16427"></a><span class="lineno">16427</span> }</div>
-<div class="line"><a name="l16428"></a><span class="lineno">16428</span>  </div>
-<div class="line"><a name="l16429"></a><span class="lineno">16429</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
-<div class="line"><a name="l16430"></a><span class="lineno">16430</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16431"></a><span class="lineno">16431</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget)</div>
-<div class="line"><a name="l16432"></a><span class="lineno">16432</span> {</div>
-<div class="line"><a name="l16433"></a><span class="lineno">16433</span>  VMA_ASSERT(allocator && pBudget);</div>
-<div class="line"><a name="l16434"></a><span class="lineno">16434</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16435"></a><span class="lineno">16435</span>  allocator->GetBudget(pBudget, 0, allocator->GetMemoryHeapCount());</div>
-<div class="line"><a name="l16436"></a><span class="lineno">16436</span> }</div>
-<div class="line"><a name="l16437"></a><span class="lineno">16437</span>  </div>
-<div class="line"><a name="l16438"></a><span class="lineno">16438</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16439"></a><span class="lineno">16439</span>  </div>
-<div class="line"><a name="l16440"></a><span class="lineno">16440</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
-<div class="line"><a name="l16441"></a><span class="lineno">16441</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16442"></a><span class="lineno">16442</span>  <span class="keywordtype">char</span>** ppStatsString,</div>
-<div class="line"><a name="l16443"></a><span class="lineno">16443</span>  VkBool32 detailedMap)</div>
-<div class="line"><a name="l16444"></a><span class="lineno">16444</span> {</div>
-<div class="line"><a name="l16445"></a><span class="lineno">16445</span>  VMA_ASSERT(allocator && ppStatsString);</div>
-<div class="line"><a name="l16446"></a><span class="lineno">16446</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16447"></a><span class="lineno">16447</span>  </div>
-<div class="line"><a name="l16448"></a><span class="lineno">16448</span>  VmaStringBuilder sb(allocator);</div>
-<div class="line"><a name="l16449"></a><span class="lineno">16449</span>  {</div>
-<div class="line"><a name="l16450"></a><span class="lineno">16450</span>  VmaJsonWriter json(allocator->GetAllocationCallbacks(), sb);</div>
-<div class="line"><a name="l16451"></a><span class="lineno">16451</span>  json.BeginObject();</div>
-<div class="line"><a name="l16452"></a><span class="lineno">16452</span>  </div>
-<div class="line"><a name="l16453"></a><span class="lineno">16453</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> budget[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l16454"></a><span class="lineno">16454</span>  allocator->GetBudget(budget, 0, allocator->GetMemoryHeapCount());</div>
-<div class="line"><a name="l16455"></a><span class="lineno">16455</span>  </div>
-<div class="line"><a name="l16456"></a><span class="lineno">16456</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div>
-<div class="line"><a name="l16457"></a><span class="lineno">16457</span>  allocator->CalculateStats(&stats);</div>
+<div class="line"><a name="l16291"></a><span class="lineno">16291</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
+<div class="line"><a name="l16292"></a><span class="lineno">16292</span>  json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l16293"></a><span class="lineno">16293</span>  json.EndString();</div>
+<div class="line"><a name="l16294"></a><span class="lineno">16294</span>  </div>
+<div class="line"><a name="l16295"></a><span class="lineno">16295</span>  json.BeginArray();</div>
+<div class="line"><a name="l16296"></a><span class="lineno">16296</span>  </div>
+<div class="line"><a name="l16297"></a><span class="lineno">16297</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < pDedicatedAllocVector->size(); ++i)</div>
+<div class="line"><a name="l16298"></a><span class="lineno">16298</span>  {</div>
+<div class="line"><a name="l16299"></a><span class="lineno">16299</span>  json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16300"></a><span class="lineno">16300</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div>
+<div class="line"><a name="l16301"></a><span class="lineno">16301</span>  hAlloc->PrintParameters(json);</div>
+<div class="line"><a name="l16302"></a><span class="lineno">16302</span>  json.EndObject();</div>
+<div class="line"><a name="l16303"></a><span class="lineno">16303</span>  }</div>
+<div class="line"><a name="l16304"></a><span class="lineno">16304</span>  </div>
+<div class="line"><a name="l16305"></a><span class="lineno">16305</span>  json.EndArray();</div>
+<div class="line"><a name="l16306"></a><span class="lineno">16306</span>  }</div>
+<div class="line"><a name="l16307"></a><span class="lineno">16307</span>  }</div>
+<div class="line"><a name="l16308"></a><span class="lineno">16308</span>  <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div>
+<div class="line"><a name="l16309"></a><span class="lineno">16309</span>  {</div>
+<div class="line"><a name="l16310"></a><span class="lineno">16310</span>  json.EndObject();</div>
+<div class="line"><a name="l16311"></a><span class="lineno">16311</span>  }</div>
+<div class="line"><a name="l16312"></a><span class="lineno">16312</span>  </div>
+<div class="line"><a name="l16313"></a><span class="lineno">16313</span>  {</div>
+<div class="line"><a name="l16314"></a><span class="lineno">16314</span>  <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16315"></a><span class="lineno">16315</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l16316"></a><span class="lineno">16316</span>  {</div>
+<div class="line"><a name="l16317"></a><span class="lineno">16317</span>  <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]->IsEmpty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16318"></a><span class="lineno">16318</span>  {</div>
+<div class="line"><a name="l16319"></a><span class="lineno">16319</span>  <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l16320"></a><span class="lineno">16320</span>  {</div>
+<div class="line"><a name="l16321"></a><span class="lineno">16321</span>  allocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l16322"></a><span class="lineno">16322</span>  json.WriteString(<span class="stringliteral">"DefaultPools"</span>);</div>
+<div class="line"><a name="l16323"></a><span class="lineno">16323</span>  json.BeginObject();</div>
+<div class="line"><a name="l16324"></a><span class="lineno">16324</span>  }</div>
+<div class="line"><a name="l16325"></a><span class="lineno">16325</span>  </div>
+<div class="line"><a name="l16326"></a><span class="lineno">16326</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
+<div class="line"><a name="l16327"></a><span class="lineno">16327</span>  json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l16328"></a><span class="lineno">16328</span>  json.EndString();</div>
+<div class="line"><a name="l16329"></a><span class="lineno">16329</span>  </div>
+<div class="line"><a name="l16330"></a><span class="lineno">16330</span>  m_pBlockVectors[memTypeIndex]->PrintDetailedMap(json);</div>
+<div class="line"><a name="l16331"></a><span class="lineno">16331</span>  }</div>
+<div class="line"><a name="l16332"></a><span class="lineno">16332</span>  }</div>
+<div class="line"><a name="l16333"></a><span class="lineno">16333</span>  <span class="keywordflow">if</span>(allocationsStarted)</div>
+<div class="line"><a name="l16334"></a><span class="lineno">16334</span>  {</div>
+<div class="line"><a name="l16335"></a><span class="lineno">16335</span>  json.EndObject();</div>
+<div class="line"><a name="l16336"></a><span class="lineno">16336</span>  }</div>
+<div class="line"><a name="l16337"></a><span class="lineno">16337</span>  }</div>
+<div class="line"><a name="l16338"></a><span class="lineno">16338</span>  </div>
+<div class="line"><a name="l16339"></a><span class="lineno">16339</span>  <span class="comment">// Custom pools</span></div>
+<div class="line"><a name="l16340"></a><span class="lineno">16340</span>  {</div>
+<div class="line"><a name="l16341"></a><span class="lineno">16341</span>  VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l16342"></a><span class="lineno">16342</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div>
+<div class="line"><a name="l16343"></a><span class="lineno">16343</span>  <span class="keywordflow">if</span>(poolCount > 0)</div>
+<div class="line"><a name="l16344"></a><span class="lineno">16344</span>  {</div>
+<div class="line"><a name="l16345"></a><span class="lineno">16345</span>  json.WriteString(<span class="stringliteral">"Pools"</span>);</div>
+<div class="line"><a name="l16346"></a><span class="lineno">16346</span>  json.BeginObject();</div>
+<div class="line"><a name="l16347"></a><span class="lineno">16347</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex < poolCount; ++poolIndex)</div>
+<div class="line"><a name="l16348"></a><span class="lineno">16348</span>  {</div>
+<div class="line"><a name="l16349"></a><span class="lineno">16349</span>  json.BeginString();</div>
+<div class="line"><a name="l16350"></a><span class="lineno">16350</span>  json.ContinueString(m_Pools[poolIndex]->GetId());</div>
+<div class="line"><a name="l16351"></a><span class="lineno">16351</span>  json.EndString();</div>
+<div class="line"><a name="l16352"></a><span class="lineno">16352</span>  </div>
+<div class="line"><a name="l16353"></a><span class="lineno">16353</span>  m_Pools[poolIndex]->m_BlockVector.PrintDetailedMap(json);</div>
+<div class="line"><a name="l16354"></a><span class="lineno">16354</span>  }</div>
+<div class="line"><a name="l16355"></a><span class="lineno">16355</span>  json.EndObject();</div>
+<div class="line"><a name="l16356"></a><span class="lineno">16356</span>  }</div>
+<div class="line"><a name="l16357"></a><span class="lineno">16357</span>  }</div>
+<div class="line"><a name="l16358"></a><span class="lineno">16358</span> }</div>
+<div class="line"><a name="l16359"></a><span class="lineno">16359</span>  </div>
+<div class="line"><a name="l16360"></a><span class="lineno">16360</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16361"></a><span class="lineno">16361</span>  </div>
+<div class="line"><a name="l16363"></a><span class="lineno">16363</span> <span class="comment">// Public interface</span></div>
+<div class="line"><a name="l16364"></a><span class="lineno">16364</span>  </div>
+<div class="line"><a name="l16365"></a><span class="lineno">16365</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
+<div class="line"><a name="l16366"></a><span class="lineno">16366</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l16367"></a><span class="lineno">16367</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div>
+<div class="line"><a name="l16368"></a><span class="lineno">16368</span> {</div>
+<div class="line"><a name="l16369"></a><span class="lineno">16369</span>  VMA_ASSERT(pCreateInfo && pAllocator);</div>
+<div class="line"><a name="l16370"></a><span class="lineno">16370</span>  VMA_ASSERT(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> == 0 ||</div>
+<div class="line"><a name="l16371"></a><span class="lineno">16371</span>  (VK_VERSION_MAJOR(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) == 1 && VK_VERSION_MINOR(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) <= 1));</div>
+<div class="line"><a name="l16372"></a><span class="lineno">16372</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateAllocator"</span>);</div>
+<div class="line"><a name="l16373"></a><span class="lineno">16373</span>  *pAllocator = vma_new(pCreateInfo-><a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div>
+<div class="line"><a name="l16374"></a><span class="lineno">16374</span>  <span class="keywordflow">return</span> (*pAllocator)->Init(pCreateInfo);</div>
+<div class="line"><a name="l16375"></a><span class="lineno">16375</span> }</div>
+<div class="line"><a name="l16376"></a><span class="lineno">16376</span>  </div>
+<div class="line"><a name="l16377"></a><span class="lineno">16377</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
+<div class="line"><a name="l16378"></a><span class="lineno">16378</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
+<div class="line"><a name="l16379"></a><span class="lineno">16379</span> {</div>
+<div class="line"><a name="l16380"></a><span class="lineno">16380</span>  <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16381"></a><span class="lineno">16381</span>  {</div>
+<div class="line"><a name="l16382"></a><span class="lineno">16382</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyAllocator"</span>);</div>
+<div class="line"><a name="l16383"></a><span class="lineno">16383</span>  VkAllocationCallbacks allocationCallbacks = allocator->m_AllocationCallbacks;</div>
+<div class="line"><a name="l16384"></a><span class="lineno">16384</span>  vma_delete(&allocationCallbacks, allocator);</div>
+<div class="line"><a name="l16385"></a><span class="lineno">16385</span>  }</div>
+<div class="line"><a name="l16386"></a><span class="lineno">16386</span> }</div>
+<div class="line"><a name="l16387"></a><span class="lineno">16387</span>  </div>
+<div class="line"><a name="l16388"></a><span class="lineno">16388</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
+<div class="line"><a name="l16389"></a><span class="lineno">16389</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16390"></a><span class="lineno">16390</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div>
+<div class="line"><a name="l16391"></a><span class="lineno">16391</span> {</div>
+<div class="line"><a name="l16392"></a><span class="lineno">16392</span>  VMA_ASSERT(allocator && ppPhysicalDeviceProperties);</div>
+<div class="line"><a name="l16393"></a><span class="lineno">16393</span>  *ppPhysicalDeviceProperties = &allocator->m_PhysicalDeviceProperties;</div>
+<div class="line"><a name="l16394"></a><span class="lineno">16394</span> }</div>
+<div class="line"><a name="l16395"></a><span class="lineno">16395</span>  </div>
+<div class="line"><a name="l16396"></a><span class="lineno">16396</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
+<div class="line"><a name="l16397"></a><span class="lineno">16397</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16398"></a><span class="lineno">16398</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div>
+<div class="line"><a name="l16399"></a><span class="lineno">16399</span> {</div>
+<div class="line"><a name="l16400"></a><span class="lineno">16400</span>  VMA_ASSERT(allocator && ppPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l16401"></a><span class="lineno">16401</span>  *ppPhysicalDeviceMemoryProperties = &allocator->m_MemProps;</div>
+<div class="line"><a name="l16402"></a><span class="lineno">16402</span> }</div>
+<div class="line"><a name="l16403"></a><span class="lineno">16403</span>  </div>
+<div class="line"><a name="l16404"></a><span class="lineno">16404</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
+<div class="line"><a name="l16405"></a><span class="lineno">16405</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16406"></a><span class="lineno">16406</span>  uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l16407"></a><span class="lineno">16407</span>  VkMemoryPropertyFlags* pFlags)</div>
+<div class="line"><a name="l16408"></a><span class="lineno">16408</span> {</div>
+<div class="line"><a name="l16409"></a><span class="lineno">16409</span>  VMA_ASSERT(allocator && pFlags);</div>
+<div class="line"><a name="l16410"></a><span class="lineno">16410</span>  VMA_ASSERT(memoryTypeIndex < allocator->GetMemoryTypeCount());</div>
+<div class="line"><a name="l16411"></a><span class="lineno">16411</span>  *pFlags = allocator->m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l16412"></a><span class="lineno">16412</span> }</div>
+<div class="line"><a name="l16413"></a><span class="lineno">16413</span>  </div>
+<div class="line"><a name="l16414"></a><span class="lineno">16414</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
+<div class="line"><a name="l16415"></a><span class="lineno">16415</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16416"></a><span class="lineno">16416</span>  uint32_t frameIndex)</div>
+<div class="line"><a name="l16417"></a><span class="lineno">16417</span> {</div>
+<div class="line"><a name="l16418"></a><span class="lineno">16418</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16419"></a><span class="lineno">16419</span>  VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l16420"></a><span class="lineno">16420</span>  </div>
+<div class="line"><a name="l16421"></a><span class="lineno">16421</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16422"></a><span class="lineno">16422</span>  </div>
+<div class="line"><a name="l16423"></a><span class="lineno">16423</span>  allocator->SetCurrentFrameIndex(frameIndex);</div>
+<div class="line"><a name="l16424"></a><span class="lineno">16424</span> }</div>
+<div class="line"><a name="l16425"></a><span class="lineno">16425</span>  </div>
+<div class="line"><a name="l16426"></a><span class="lineno">16426</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
+<div class="line"><a name="l16427"></a><span class="lineno">16427</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16428"></a><span class="lineno">16428</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l16429"></a><span class="lineno">16429</span> {</div>
+<div class="line"><a name="l16430"></a><span class="lineno">16430</span>  VMA_ASSERT(allocator && pStats);</div>
+<div class="line"><a name="l16431"></a><span class="lineno">16431</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16432"></a><span class="lineno">16432</span>  allocator->CalculateStats(pStats);</div>
+<div class="line"><a name="l16433"></a><span class="lineno">16433</span> }</div>
+<div class="line"><a name="l16434"></a><span class="lineno">16434</span>  </div>
+<div class="line"><a name="l16435"></a><span class="lineno">16435</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
+<div class="line"><a name="l16436"></a><span class="lineno">16436</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16437"></a><span class="lineno">16437</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget)</div>
+<div class="line"><a name="l16438"></a><span class="lineno">16438</span> {</div>
+<div class="line"><a name="l16439"></a><span class="lineno">16439</span>  VMA_ASSERT(allocator && pBudget);</div>
+<div class="line"><a name="l16440"></a><span class="lineno">16440</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16441"></a><span class="lineno">16441</span>  allocator->GetBudget(pBudget, 0, allocator->GetMemoryHeapCount());</div>
+<div class="line"><a name="l16442"></a><span class="lineno">16442</span> }</div>
+<div class="line"><a name="l16443"></a><span class="lineno">16443</span>  </div>
+<div class="line"><a name="l16444"></a><span class="lineno">16444</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16445"></a><span class="lineno">16445</span>  </div>
+<div class="line"><a name="l16446"></a><span class="lineno">16446</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
+<div class="line"><a name="l16447"></a><span class="lineno">16447</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16448"></a><span class="lineno">16448</span>  <span class="keywordtype">char</span>** ppStatsString,</div>
+<div class="line"><a name="l16449"></a><span class="lineno">16449</span>  VkBool32 detailedMap)</div>
+<div class="line"><a name="l16450"></a><span class="lineno">16450</span> {</div>
+<div class="line"><a name="l16451"></a><span class="lineno">16451</span>  VMA_ASSERT(allocator && ppStatsString);</div>
+<div class="line"><a name="l16452"></a><span class="lineno">16452</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16453"></a><span class="lineno">16453</span>  </div>
+<div class="line"><a name="l16454"></a><span class="lineno">16454</span>  VmaStringBuilder sb(allocator);</div>
+<div class="line"><a name="l16455"></a><span class="lineno">16455</span>  {</div>
+<div class="line"><a name="l16456"></a><span class="lineno">16456</span>  VmaJsonWriter json(allocator->GetAllocationCallbacks(), sb);</div>
+<div class="line"><a name="l16457"></a><span class="lineno">16457</span>  json.BeginObject();</div>
<div class="line"><a name="l16458"></a><span class="lineno">16458</span>  </div>
-<div class="line"><a name="l16459"></a><span class="lineno">16459</span>  json.WriteString(<span class="stringliteral">"Total"</span>);</div>
-<div class="line"><a name="l16460"></a><span class="lineno">16460</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l16461"></a><span class="lineno">16461</span>  </div>
-<div class="line"><a name="l16462"></a><span class="lineno">16462</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < allocator->GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l16463"></a><span class="lineno">16463</span>  {</div>
-<div class="line"><a name="l16464"></a><span class="lineno">16464</span>  json.BeginString(<span class="stringliteral">"Heap "</span>);</div>
-<div class="line"><a name="l16465"></a><span class="lineno">16465</span>  json.ContinueString(heapIndex);</div>
-<div class="line"><a name="l16466"></a><span class="lineno">16466</span>  json.EndString();</div>
-<div class="line"><a name="l16467"></a><span class="lineno">16467</span>  json.BeginObject();</div>
-<div class="line"><a name="l16468"></a><span class="lineno">16468</span>  </div>
-<div class="line"><a name="l16469"></a><span class="lineno">16469</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div>
-<div class="line"><a name="l16470"></a><span class="lineno">16470</span>  json.WriteNumber(allocator->m_MemProps.memoryHeaps[heapIndex].size);</div>
-<div class="line"><a name="l16471"></a><span class="lineno">16471</span>  </div>
-<div class="line"><a name="l16472"></a><span class="lineno">16472</span>  json.WriteString(<span class="stringliteral">"Flags"</span>);</div>
-<div class="line"><a name="l16473"></a><span class="lineno">16473</span>  json.BeginArray(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l16474"></a><span class="lineno">16474</span>  <span class="keywordflow">if</span>((allocator->m_MemProps.memoryHeaps[heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div>
-<div class="line"><a name="l16475"></a><span class="lineno">16475</span>  {</div>
-<div class="line"><a name="l16476"></a><span class="lineno">16476</span>  json.WriteString(<span class="stringliteral">"DEVICE_LOCAL"</span>);</div>
-<div class="line"><a name="l16477"></a><span class="lineno">16477</span>  }</div>
-<div class="line"><a name="l16478"></a><span class="lineno">16478</span>  json.EndArray();</div>
-<div class="line"><a name="l16479"></a><span class="lineno">16479</span>  </div>
-<div class="line"><a name="l16480"></a><span class="lineno">16480</span>  json.WriteString(<span class="stringliteral">"Budget"</span>);</div>
-<div class="line"><a name="l16481"></a><span class="lineno">16481</span>  json.BeginObject();</div>
-<div class="line"><a name="l16482"></a><span class="lineno">16482</span>  {</div>
-<div class="line"><a name="l16483"></a><span class="lineno">16483</span>  json.WriteString(<span class="stringliteral">"BlockBytes"</span>);</div>
-<div class="line"><a name="l16484"></a><span class="lineno">16484</span>  json.WriteNumber(budget[heapIndex].blockBytes);</div>
-<div class="line"><a name="l16485"></a><span class="lineno">16485</span>  json.WriteString(<span class="stringliteral">"AllocationBytes"</span>);</div>
-<div class="line"><a name="l16486"></a><span class="lineno">16486</span>  json.WriteNumber(budget[heapIndex].allocationBytes);</div>
-<div class="line"><a name="l16487"></a><span class="lineno">16487</span>  json.WriteString(<span class="stringliteral">"Usage"</span>);</div>
-<div class="line"><a name="l16488"></a><span class="lineno">16488</span>  json.WriteNumber(budget[heapIndex].usage);</div>
-<div class="line"><a name="l16489"></a><span class="lineno">16489</span>  json.WriteString(<span class="stringliteral">"Budget"</span>);</div>
-<div class="line"><a name="l16490"></a><span class="lineno">16490</span>  json.WriteNumber(budget[heapIndex].budget);</div>
-<div class="line"><a name="l16491"></a><span class="lineno">16491</span>  }</div>
-<div class="line"><a name="l16492"></a><span class="lineno">16492</span>  json.EndObject();</div>
-<div class="line"><a name="l16493"></a><span class="lineno">16493</span>  </div>
-<div class="line"><a name="l16494"></a><span class="lineno">16494</span>  <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> > 0)</div>
-<div class="line"><a name="l16495"></a><span class="lineno">16495</span>  {</div>
-<div class="line"><a name="l16496"></a><span class="lineno">16496</span>  json.WriteString(<span class="stringliteral">"Stats"</span>);</div>
-<div class="line"><a name="l16497"></a><span class="lineno">16497</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div>
-<div class="line"><a name="l16498"></a><span class="lineno">16498</span>  }</div>
+<div class="line"><a name="l16459"></a><span class="lineno">16459</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> budget[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l16460"></a><span class="lineno">16460</span>  allocator->GetBudget(budget, 0, allocator->GetMemoryHeapCount());</div>
+<div class="line"><a name="l16461"></a><span class="lineno">16461</span>  </div>
+<div class="line"><a name="l16462"></a><span class="lineno">16462</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div>
+<div class="line"><a name="l16463"></a><span class="lineno">16463</span>  allocator->CalculateStats(&stats);</div>
+<div class="line"><a name="l16464"></a><span class="lineno">16464</span>  </div>
+<div class="line"><a name="l16465"></a><span class="lineno">16465</span>  json.WriteString(<span class="stringliteral">"Total"</span>);</div>
+<div class="line"><a name="l16466"></a><span class="lineno">16466</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l16467"></a><span class="lineno">16467</span>  </div>
+<div class="line"><a name="l16468"></a><span class="lineno">16468</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < allocator->GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l16469"></a><span class="lineno">16469</span>  {</div>
+<div class="line"><a name="l16470"></a><span class="lineno">16470</span>  json.BeginString(<span class="stringliteral">"Heap "</span>);</div>
+<div class="line"><a name="l16471"></a><span class="lineno">16471</span>  json.ContinueString(heapIndex);</div>
+<div class="line"><a name="l16472"></a><span class="lineno">16472</span>  json.EndString();</div>
+<div class="line"><a name="l16473"></a><span class="lineno">16473</span>  json.BeginObject();</div>
+<div class="line"><a name="l16474"></a><span class="lineno">16474</span>  </div>
+<div class="line"><a name="l16475"></a><span class="lineno">16475</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div>
+<div class="line"><a name="l16476"></a><span class="lineno">16476</span>  json.WriteNumber(allocator->m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l16477"></a><span class="lineno">16477</span>  </div>
+<div class="line"><a name="l16478"></a><span class="lineno">16478</span>  json.WriteString(<span class="stringliteral">"Flags"</span>);</div>
+<div class="line"><a name="l16479"></a><span class="lineno">16479</span>  json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16480"></a><span class="lineno">16480</span>  <span class="keywordflow">if</span>((allocator->m_MemProps.memoryHeaps[heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div>
+<div class="line"><a name="l16481"></a><span class="lineno">16481</span>  {</div>
+<div class="line"><a name="l16482"></a><span class="lineno">16482</span>  json.WriteString(<span class="stringliteral">"DEVICE_LOCAL"</span>);</div>
+<div class="line"><a name="l16483"></a><span class="lineno">16483</span>  }</div>
+<div class="line"><a name="l16484"></a><span class="lineno">16484</span>  json.EndArray();</div>
+<div class="line"><a name="l16485"></a><span class="lineno">16485</span>  </div>
+<div class="line"><a name="l16486"></a><span class="lineno">16486</span>  json.WriteString(<span class="stringliteral">"Budget"</span>);</div>
+<div class="line"><a name="l16487"></a><span class="lineno">16487</span>  json.BeginObject();</div>
+<div class="line"><a name="l16488"></a><span class="lineno">16488</span>  {</div>
+<div class="line"><a name="l16489"></a><span class="lineno">16489</span>  json.WriteString(<span class="stringliteral">"BlockBytes"</span>);</div>
+<div class="line"><a name="l16490"></a><span class="lineno">16490</span>  json.WriteNumber(budget[heapIndex].blockBytes);</div>
+<div class="line"><a name="l16491"></a><span class="lineno">16491</span>  json.WriteString(<span class="stringliteral">"AllocationBytes"</span>);</div>
+<div class="line"><a name="l16492"></a><span class="lineno">16492</span>  json.WriteNumber(budget[heapIndex].allocationBytes);</div>
+<div class="line"><a name="l16493"></a><span class="lineno">16493</span>  json.WriteString(<span class="stringliteral">"Usage"</span>);</div>
+<div class="line"><a name="l16494"></a><span class="lineno">16494</span>  json.WriteNumber(budget[heapIndex].usage);</div>
+<div class="line"><a name="l16495"></a><span class="lineno">16495</span>  json.WriteString(<span class="stringliteral">"Budget"</span>);</div>
+<div class="line"><a name="l16496"></a><span class="lineno">16496</span>  json.WriteNumber(budget[heapIndex].budget);</div>
+<div class="line"><a name="l16497"></a><span class="lineno">16497</span>  }</div>
+<div class="line"><a name="l16498"></a><span class="lineno">16498</span>  json.EndObject();</div>
<div class="line"><a name="l16499"></a><span class="lineno">16499</span>  </div>
-<div class="line"><a name="l16500"></a><span class="lineno">16500</span>  <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex < allocator->GetMemoryTypeCount(); ++typeIndex)</div>
+<div class="line"><a name="l16500"></a><span class="lineno">16500</span>  <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> > 0)</div>
<div class="line"><a name="l16501"></a><span class="lineno">16501</span>  {</div>
-<div class="line"><a name="l16502"></a><span class="lineno">16502</span>  <span class="keywordflow">if</span>(allocator->MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div>
-<div class="line"><a name="l16503"></a><span class="lineno">16503</span>  {</div>
-<div class="line"><a name="l16504"></a><span class="lineno">16504</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
-<div class="line"><a name="l16505"></a><span class="lineno">16505</span>  json.ContinueString(typeIndex);</div>
-<div class="line"><a name="l16506"></a><span class="lineno">16506</span>  json.EndString();</div>
-<div class="line"><a name="l16507"></a><span class="lineno">16507</span>  </div>
-<div class="line"><a name="l16508"></a><span class="lineno">16508</span>  json.BeginObject();</div>
-<div class="line"><a name="l16509"></a><span class="lineno">16509</span>  </div>
-<div class="line"><a name="l16510"></a><span class="lineno">16510</span>  json.WriteString(<span class="stringliteral">"Flags"</span>);</div>
-<div class="line"><a name="l16511"></a><span class="lineno">16511</span>  json.BeginArray(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l16512"></a><span class="lineno">16512</span>  VkMemoryPropertyFlags flags = allocator->m_MemProps.memoryTypes[typeIndex].propertyFlags;</div>
-<div class="line"><a name="l16513"></a><span class="lineno">16513</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div>
-<div class="line"><a name="l16514"></a><span class="lineno">16514</span>  {</div>
-<div class="line"><a name="l16515"></a><span class="lineno">16515</span>  json.WriteString(<span class="stringliteral">"DEVICE_LOCAL"</span>);</div>
-<div class="line"><a name="l16516"></a><span class="lineno">16516</span>  }</div>
-<div class="line"><a name="l16517"></a><span class="lineno">16517</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
-<div class="line"><a name="l16518"></a><span class="lineno">16518</span>  {</div>
-<div class="line"><a name="l16519"></a><span class="lineno">16519</span>  json.WriteString(<span class="stringliteral">"HOST_VISIBLE"</span>);</div>
-<div class="line"><a name="l16520"></a><span class="lineno">16520</span>  }</div>
-<div class="line"><a name="l16521"></a><span class="lineno">16521</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div>
-<div class="line"><a name="l16522"></a><span class="lineno">16522</span>  {</div>
-<div class="line"><a name="l16523"></a><span class="lineno">16523</span>  json.WriteString(<span class="stringliteral">"HOST_COHERENT"</span>);</div>
-<div class="line"><a name="l16524"></a><span class="lineno">16524</span>  }</div>
-<div class="line"><a name="l16525"></a><span class="lineno">16525</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div>
-<div class="line"><a name="l16526"></a><span class="lineno">16526</span>  {</div>
-<div class="line"><a name="l16527"></a><span class="lineno">16527</span>  json.WriteString(<span class="stringliteral">"HOST_CACHED"</span>);</div>
-<div class="line"><a name="l16528"></a><span class="lineno">16528</span>  }</div>
-<div class="line"><a name="l16529"></a><span class="lineno">16529</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div>
-<div class="line"><a name="l16530"></a><span class="lineno">16530</span>  {</div>
-<div class="line"><a name="l16531"></a><span class="lineno">16531</span>  json.WriteString(<span class="stringliteral">"LAZILY_ALLOCATED"</span>);</div>
-<div class="line"><a name="l16532"></a><span class="lineno">16532</span>  }</div>
-<div class="line"><a name="l16533"></a><span class="lineno">16533</span>  json.EndArray();</div>
-<div class="line"><a name="l16534"></a><span class="lineno">16534</span>  </div>
-<div class="line"><a name="l16535"></a><span class="lineno">16535</span>  <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> > 0)</div>
+<div class="line"><a name="l16502"></a><span class="lineno">16502</span>  json.WriteString(<span class="stringliteral">"Stats"</span>);</div>
+<div class="line"><a name="l16503"></a><span class="lineno">16503</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div>
+<div class="line"><a name="l16504"></a><span class="lineno">16504</span>  }</div>
+<div class="line"><a name="l16505"></a><span class="lineno">16505</span>  </div>
+<div class="line"><a name="l16506"></a><span class="lineno">16506</span>  <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex < allocator->GetMemoryTypeCount(); ++typeIndex)</div>
+<div class="line"><a name="l16507"></a><span class="lineno">16507</span>  {</div>
+<div class="line"><a name="l16508"></a><span class="lineno">16508</span>  <span class="keywordflow">if</span>(allocator->MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div>
+<div class="line"><a name="l16509"></a><span class="lineno">16509</span>  {</div>
+<div class="line"><a name="l16510"></a><span class="lineno">16510</span>  json.BeginString(<span class="stringliteral">"Type "</span>);</div>
+<div class="line"><a name="l16511"></a><span class="lineno">16511</span>  json.ContinueString(typeIndex);</div>
+<div class="line"><a name="l16512"></a><span class="lineno">16512</span>  json.EndString();</div>
+<div class="line"><a name="l16513"></a><span class="lineno">16513</span>  </div>
+<div class="line"><a name="l16514"></a><span class="lineno">16514</span>  json.BeginObject();</div>
+<div class="line"><a name="l16515"></a><span class="lineno">16515</span>  </div>
+<div class="line"><a name="l16516"></a><span class="lineno">16516</span>  json.WriteString(<span class="stringliteral">"Flags"</span>);</div>
+<div class="line"><a name="l16517"></a><span class="lineno">16517</span>  json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l16518"></a><span class="lineno">16518</span>  VkMemoryPropertyFlags flags = allocator->m_MemProps.memoryTypes[typeIndex].propertyFlags;</div>
+<div class="line"><a name="l16519"></a><span class="lineno">16519</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div>
+<div class="line"><a name="l16520"></a><span class="lineno">16520</span>  {</div>
+<div class="line"><a name="l16521"></a><span class="lineno">16521</span>  json.WriteString(<span class="stringliteral">"DEVICE_LOCAL"</span>);</div>
+<div class="line"><a name="l16522"></a><span class="lineno">16522</span>  }</div>
+<div class="line"><a name="l16523"></a><span class="lineno">16523</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l16524"></a><span class="lineno">16524</span>  {</div>
+<div class="line"><a name="l16525"></a><span class="lineno">16525</span>  json.WriteString(<span class="stringliteral">"HOST_VISIBLE"</span>);</div>
+<div class="line"><a name="l16526"></a><span class="lineno">16526</span>  }</div>
+<div class="line"><a name="l16527"></a><span class="lineno">16527</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div>
+<div class="line"><a name="l16528"></a><span class="lineno">16528</span>  {</div>
+<div class="line"><a name="l16529"></a><span class="lineno">16529</span>  json.WriteString(<span class="stringliteral">"HOST_COHERENT"</span>);</div>
+<div class="line"><a name="l16530"></a><span class="lineno">16530</span>  }</div>
+<div class="line"><a name="l16531"></a><span class="lineno">16531</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div>
+<div class="line"><a name="l16532"></a><span class="lineno">16532</span>  {</div>
+<div class="line"><a name="l16533"></a><span class="lineno">16533</span>  json.WriteString(<span class="stringliteral">"HOST_CACHED"</span>);</div>
+<div class="line"><a name="l16534"></a><span class="lineno">16534</span>  }</div>
+<div class="line"><a name="l16535"></a><span class="lineno">16535</span>  <span class="keywordflow">if</span>((flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div>
<div class="line"><a name="l16536"></a><span class="lineno">16536</span>  {</div>
-<div class="line"><a name="l16537"></a><span class="lineno">16537</span>  json.WriteString(<span class="stringliteral">"Stats"</span>);</div>
-<div class="line"><a name="l16538"></a><span class="lineno">16538</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div>
-<div class="line"><a name="l16539"></a><span class="lineno">16539</span>  }</div>
+<div class="line"><a name="l16537"></a><span class="lineno">16537</span>  json.WriteString(<span class="stringliteral">"LAZILY_ALLOCATED"</span>);</div>
+<div class="line"><a name="l16538"></a><span class="lineno">16538</span>  }</div>
+<div class="line"><a name="l16539"></a><span class="lineno">16539</span>  json.EndArray();</div>
<div class="line"><a name="l16540"></a><span class="lineno">16540</span>  </div>
-<div class="line"><a name="l16541"></a><span class="lineno">16541</span>  json.EndObject();</div>
-<div class="line"><a name="l16542"></a><span class="lineno">16542</span>  }</div>
-<div class="line"><a name="l16543"></a><span class="lineno">16543</span>  }</div>
-<div class="line"><a name="l16544"></a><span class="lineno">16544</span>  </div>
-<div class="line"><a name="l16545"></a><span class="lineno">16545</span>  json.EndObject();</div>
-<div class="line"><a name="l16546"></a><span class="lineno">16546</span>  }</div>
-<div class="line"><a name="l16547"></a><span class="lineno">16547</span>  <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div>
-<div class="line"><a name="l16548"></a><span class="lineno">16548</span>  {</div>
-<div class="line"><a name="l16549"></a><span class="lineno">16549</span>  allocator->PrintDetailedMap(json);</div>
-<div class="line"><a name="l16550"></a><span class="lineno">16550</span>  }</div>
-<div class="line"><a name="l16551"></a><span class="lineno">16551</span>  </div>
-<div class="line"><a name="l16552"></a><span class="lineno">16552</span>  json.EndObject();</div>
-<div class="line"><a name="l16553"></a><span class="lineno">16553</span>  }</div>
-<div class="line"><a name="l16554"></a><span class="lineno">16554</span>  </div>
-<div class="line"><a name="l16555"></a><span class="lineno">16555</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div>
-<div class="line"><a name="l16556"></a><span class="lineno">16556</span>  <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="l16557"></a><span class="lineno">16557</span>  <span class="keywordflow">if</span>(len > 0)</div>
-<div class="line"><a name="l16558"></a><span class="lineno">16558</span>  {</div>
-<div class="line"><a name="l16559"></a><span class="lineno">16559</span>  memcpy(pChars, sb.GetData(), len);</div>
-<div class="line"><a name="l16560"></a><span class="lineno">16560</span>  }</div>
-<div class="line"><a name="l16561"></a><span class="lineno">16561</span>  pChars[len] = <span class="charliteral">'\0'</span>;</div>
-<div class="line"><a name="l16562"></a><span class="lineno">16562</span>  *ppStatsString = pChars;</div>
-<div class="line"><a name="l16563"></a><span class="lineno">16563</span> }</div>
-<div class="line"><a name="l16564"></a><span class="lineno">16564</span>  </div>
-<div class="line"><a name="l16565"></a><span class="lineno">16565</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
-<div class="line"><a name="l16566"></a><span class="lineno">16566</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16567"></a><span class="lineno">16567</span>  <span class="keywordtype">char</span>* pStatsString)</div>
-<div class="line"><a name="l16568"></a><span class="lineno">16568</span> {</div>
-<div class="line"><a name="l16569"></a><span class="lineno">16569</span>  <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div>
-<div class="line"><a name="l16570"></a><span class="lineno">16570</span>  {</div>
-<div class="line"><a name="l16571"></a><span class="lineno">16571</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l16572"></a><span class="lineno">16572</span>  <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div>
-<div class="line"><a name="l16573"></a><span class="lineno">16573</span>  vma_delete_array(allocator, pStatsString, len + 1);</div>
-<div class="line"><a name="l16574"></a><span class="lineno">16574</span>  }</div>
-<div class="line"><a name="l16575"></a><span class="lineno">16575</span> }</div>
-<div class="line"><a name="l16576"></a><span class="lineno">16576</span>  </div>
-<div class="line"><a name="l16577"></a><span class="lineno">16577</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16578"></a><span class="lineno">16578</span>  </div>
-<div class="line"><a name="l16579"></a><span class="lineno">16579</span> <span class="comment">/*</span></div>
-<div class="line"><a name="l16580"></a><span class="lineno">16580</span> <span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div>
-<div class="line"><a name="l16581"></a><span class="lineno">16581</span> <span class="comment">*/</span></div>
-<div class="line"><a name="l16582"></a><span class="lineno">16582</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l16583"></a><span class="lineno">16583</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16584"></a><span class="lineno">16584</span>  uint32_t memoryTypeBits,</div>
-<div class="line"><a name="l16585"></a><span class="lineno">16585</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l16586"></a><span class="lineno">16586</span>  uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l16587"></a><span class="lineno">16587</span> {</div>
-<div class="line"><a name="l16588"></a><span class="lineno">16588</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l16589"></a><span class="lineno">16589</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l16590"></a><span class="lineno">16590</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l16591"></a><span class="lineno">16591</span>  </div>
-<div class="line"><a name="l16592"></a><span class="lineno">16592</span>  <span class="keywordflow">if</span>(pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div>
-<div class="line"><a name="l16593"></a><span class="lineno">16593</span>  {</div>
-<div class="line"><a name="l16594"></a><span class="lineno">16594</span>  memoryTypeBits &= pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
-<div class="line"><a name="l16595"></a><span class="lineno">16595</span>  }</div>
-<div class="line"><a name="l16596"></a><span class="lineno">16596</span>  </div>
-<div class="line"><a name="l16597"></a><span class="lineno">16597</span>  uint32_t requiredFlags = pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
-<div class="line"><a name="l16598"></a><span class="lineno">16598</span>  uint32_t preferredFlags = pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
-<div class="line"><a name="l16599"></a><span class="lineno">16599</span>  uint32_t notPreferredFlags = 0;</div>
-<div class="line"><a name="l16600"></a><span class="lineno">16600</span>  </div>
-<div class="line"><a name="l16601"></a><span class="lineno">16601</span>  <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div>
-<div class="line"><a name="l16602"></a><span class="lineno">16602</span>  <span class="keywordflow">switch</span>(pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div>
-<div class="line"><a name="l16603"></a><span class="lineno">16603</span>  {</div>
-<div class="line"><a name="l16604"></a><span class="lineno">16604</span>  <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="l16605"></a><span class="lineno">16605</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16606"></a><span class="lineno">16606</span>  <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="l16607"></a><span class="lineno">16607</span>  <span class="keywordflow">if</span>(!allocator->IsIntegratedGpu() || (preferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l16608"></a><span class="lineno">16608</span>  {</div>
-<div class="line"><a name="l16609"></a><span class="lineno">16609</span>  preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l16610"></a><span class="lineno">16610</span>  }</div>
+<div class="line"><a name="l16541"></a><span class="lineno">16541</span>  <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> > 0)</div>
+<div class="line"><a name="l16542"></a><span class="lineno">16542</span>  {</div>
+<div class="line"><a name="l16543"></a><span class="lineno">16543</span>  json.WriteString(<span class="stringliteral">"Stats"</span>);</div>
+<div class="line"><a name="l16544"></a><span class="lineno">16544</span>  VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div>
+<div class="line"><a name="l16545"></a><span class="lineno">16545</span>  }</div>
+<div class="line"><a name="l16546"></a><span class="lineno">16546</span>  </div>
+<div class="line"><a name="l16547"></a><span class="lineno">16547</span>  json.EndObject();</div>
+<div class="line"><a name="l16548"></a><span class="lineno">16548</span>  }</div>
+<div class="line"><a name="l16549"></a><span class="lineno">16549</span>  }</div>
+<div class="line"><a name="l16550"></a><span class="lineno">16550</span>  </div>
+<div class="line"><a name="l16551"></a><span class="lineno">16551</span>  json.EndObject();</div>
+<div class="line"><a name="l16552"></a><span class="lineno">16552</span>  }</div>
+<div class="line"><a name="l16553"></a><span class="lineno">16553</span>  <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div>
+<div class="line"><a name="l16554"></a><span class="lineno">16554</span>  {</div>
+<div class="line"><a name="l16555"></a><span class="lineno">16555</span>  allocator->PrintDetailedMap(json);</div>
+<div class="line"><a name="l16556"></a><span class="lineno">16556</span>  }</div>
+<div class="line"><a name="l16557"></a><span class="lineno">16557</span>  </div>
+<div class="line"><a name="l16558"></a><span class="lineno">16558</span>  json.EndObject();</div>
+<div class="line"><a name="l16559"></a><span class="lineno">16559</span>  }</div>
+<div class="line"><a name="l16560"></a><span class="lineno">16560</span>  </div>
+<div class="line"><a name="l16561"></a><span class="lineno">16561</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div>
+<div class="line"><a name="l16562"></a><span class="lineno">16562</span>  <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="l16563"></a><span class="lineno">16563</span>  <span class="keywordflow">if</span>(len > 0)</div>
+<div class="line"><a name="l16564"></a><span class="lineno">16564</span>  {</div>
+<div class="line"><a name="l16565"></a><span class="lineno">16565</span>  memcpy(pChars, sb.GetData(), len);</div>
+<div class="line"><a name="l16566"></a><span class="lineno">16566</span>  }</div>
+<div class="line"><a name="l16567"></a><span class="lineno">16567</span>  pChars[len] = <span class="charliteral">'\0'</span>;</div>
+<div class="line"><a name="l16568"></a><span class="lineno">16568</span>  *ppStatsString = pChars;</div>
+<div class="line"><a name="l16569"></a><span class="lineno">16569</span> }</div>
+<div class="line"><a name="l16570"></a><span class="lineno">16570</span>  </div>
+<div class="line"><a name="l16571"></a><span class="lineno">16571</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
+<div class="line"><a name="l16572"></a><span class="lineno">16572</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16573"></a><span class="lineno">16573</span>  <span class="keywordtype">char</span>* pStatsString)</div>
+<div class="line"><a name="l16574"></a><span class="lineno">16574</span> {</div>
+<div class="line"><a name="l16575"></a><span class="lineno">16575</span>  <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div>
+<div class="line"><a name="l16576"></a><span class="lineno">16576</span>  {</div>
+<div class="line"><a name="l16577"></a><span class="lineno">16577</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16578"></a><span class="lineno">16578</span>  <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div>
+<div class="line"><a name="l16579"></a><span class="lineno">16579</span>  vma_delete_array(allocator, pStatsString, len + 1);</div>
+<div class="line"><a name="l16580"></a><span class="lineno">16580</span>  }</div>
+<div class="line"><a name="l16581"></a><span class="lineno">16581</span> }</div>
+<div class="line"><a name="l16582"></a><span class="lineno">16582</span>  </div>
+<div class="line"><a name="l16583"></a><span class="lineno">16583</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l16584"></a><span class="lineno">16584</span>  </div>
+<div class="line"><a name="l16585"></a><span class="lineno">16585</span> <span class="comment">/*</span></div>
+<div class="line"><a name="l16586"></a><span class="lineno">16586</span> <span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div>
+<div class="line"><a name="l16587"></a><span class="lineno">16587</span> <span class="comment">*/</span></div>
+<div class="line"><a name="l16588"></a><span class="lineno">16588</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16589"></a><span class="lineno">16589</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16590"></a><span class="lineno">16590</span>  uint32_t memoryTypeBits,</div>
+<div class="line"><a name="l16591"></a><span class="lineno">16591</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l16592"></a><span class="lineno">16592</span>  uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16593"></a><span class="lineno">16593</span> {</div>
+<div class="line"><a name="l16594"></a><span class="lineno">16594</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16595"></a><span class="lineno">16595</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16596"></a><span class="lineno">16596</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16597"></a><span class="lineno">16597</span>  </div>
+<div class="line"><a name="l16598"></a><span class="lineno">16598</span>  <span class="keywordflow">if</span>(pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div>
+<div class="line"><a name="l16599"></a><span class="lineno">16599</span>  {</div>
+<div class="line"><a name="l16600"></a><span class="lineno">16600</span>  memoryTypeBits &= pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
+<div class="line"><a name="l16601"></a><span class="lineno">16601</span>  }</div>
+<div class="line"><a name="l16602"></a><span class="lineno">16602</span>  </div>
+<div class="line"><a name="l16603"></a><span class="lineno">16603</span>  uint32_t requiredFlags = pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
+<div class="line"><a name="l16604"></a><span class="lineno">16604</span>  uint32_t preferredFlags = pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
+<div class="line"><a name="l16605"></a><span class="lineno">16605</span>  uint32_t notPreferredFlags = 0;</div>
+<div class="line"><a name="l16606"></a><span class="lineno">16606</span>  </div>
+<div class="line"><a name="l16607"></a><span class="lineno">16607</span>  <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div>
+<div class="line"><a name="l16608"></a><span class="lineno">16608</span>  <span class="keywordflow">switch</span>(pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div>
+<div class="line"><a name="l16609"></a><span class="lineno">16609</span>  {</div>
+<div class="line"><a name="l16610"></a><span class="lineno">16610</span>  <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="l16611"></a><span class="lineno">16611</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16612"></a><span class="lineno">16612</span>  <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="l16613"></a><span class="lineno">16613</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
-<div class="line"><a name="l16614"></a><span class="lineno">16614</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16615"></a><span class="lineno">16615</span>  <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="l16616"></a><span class="lineno">16616</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
-<div class="line"><a name="l16617"></a><span class="lineno">16617</span>  <span class="keywordflow">if</span>(!allocator->IsIntegratedGpu() || (preferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l16618"></a><span class="lineno">16618</span>  {</div>
-<div class="line"><a name="l16619"></a><span class="lineno">16619</span>  preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l16620"></a><span class="lineno">16620</span>  }</div>
-<div class="line"><a name="l16621"></a><span class="lineno">16621</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16622"></a><span class="lineno">16622</span>  <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="l16623"></a><span class="lineno">16623</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
-<div class="line"><a name="l16624"></a><span class="lineno">16624</span>  preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
-<div class="line"><a name="l16625"></a><span class="lineno">16625</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16626"></a><span class="lineno">16626</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a>:</div>
-<div class="line"><a name="l16627"></a><span class="lineno">16627</span>  notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l16628"></a><span class="lineno">16628</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16629"></a><span class="lineno">16629</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>:</div>
-<div class="line"><a name="l16630"></a><span class="lineno">16630</span>  requiredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;</div>
+<div class="line"><a name="l16612"></a><span class="lineno">16612</span>  <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="l16613"></a><span class="lineno">16613</span>  <span class="keywordflow">if</span>(!allocator->IsIntegratedGpu() || (preferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l16614"></a><span class="lineno">16614</span>  {</div>
+<div class="line"><a name="l16615"></a><span class="lineno">16615</span>  preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l16616"></a><span class="lineno">16616</span>  }</div>
+<div class="line"><a name="l16617"></a><span class="lineno">16617</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16618"></a><span class="lineno">16618</span>  <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="l16619"></a><span class="lineno">16619</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
+<div class="line"><a name="l16620"></a><span class="lineno">16620</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16621"></a><span class="lineno">16621</span>  <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="l16622"></a><span class="lineno">16622</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l16623"></a><span class="lineno">16623</span>  <span class="keywordflow">if</span>(!allocator->IsIntegratedGpu() || (preferredFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l16624"></a><span class="lineno">16624</span>  {</div>
+<div class="line"><a name="l16625"></a><span class="lineno">16625</span>  preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l16626"></a><span class="lineno">16626</span>  }</div>
+<div class="line"><a name="l16627"></a><span class="lineno">16627</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16628"></a><span class="lineno">16628</span>  <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="l16629"></a><span class="lineno">16629</span>  requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l16630"></a><span class="lineno">16630</span>  preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
<div class="line"><a name="l16631"></a><span class="lineno">16631</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16632"></a><span class="lineno">16632</span>  <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16633"></a><span class="lineno">16633</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16632"></a><span class="lineno">16632</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a>:</div>
+<div class="line"><a name="l16633"></a><span class="lineno">16633</span>  notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
<div class="line"><a name="l16634"></a><span class="lineno">16634</span>  <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16635"></a><span class="lineno">16635</span>  }</div>
-<div class="line"><a name="l16636"></a><span class="lineno">16636</span>  </div>
-<div class="line"><a name="l16637"></a><span class="lineno">16637</span>  *pMemoryTypeIndex = UINT32_MAX;</div>
-<div class="line"><a name="l16638"></a><span class="lineno">16638</span>  uint32_t minCost = UINT32_MAX;</div>
-<div class="line"><a name="l16639"></a><span class="lineno">16639</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div>
-<div class="line"><a name="l16640"></a><span class="lineno">16640</span>  memTypeIndex < allocator->GetMemoryTypeCount();</div>
-<div class="line"><a name="l16641"></a><span class="lineno">16641</span>  ++memTypeIndex, memTypeBit <<= 1)</div>
-<div class="line"><a name="l16642"></a><span class="lineno">16642</span>  {</div>
-<div class="line"><a name="l16643"></a><span class="lineno">16643</span>  <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div>
-<div class="line"><a name="l16644"></a><span class="lineno">16644</span>  <span class="keywordflow">if</span>((memTypeBit & memoryTypeBits) != 0)</div>
-<div class="line"><a name="l16645"></a><span class="lineno">16645</span>  {</div>
-<div class="line"><a name="l16646"></a><span class="lineno">16646</span>  <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div>
-<div class="line"><a name="l16647"></a><span class="lineno">16647</span>  allocator->m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l16648"></a><span class="lineno">16648</span>  <span class="comment">// This memory type contains requiredFlags.</span></div>
-<div class="line"><a name="l16649"></a><span class="lineno">16649</span>  <span class="keywordflow">if</span>((requiredFlags & ~currFlags) == 0)</div>
-<div class="line"><a name="l16650"></a><span class="lineno">16650</span>  {</div>
-<div class="line"><a name="l16651"></a><span class="lineno">16651</span>  <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div>
-<div class="line"><a name="l16652"></a><span class="lineno">16652</span>  uint32_t currCost = VmaCountBitsSet(preferredFlags & ~currFlags) +</div>
-<div class="line"><a name="l16653"></a><span class="lineno">16653</span>  VmaCountBitsSet(currFlags & notPreferredFlags);</div>
-<div class="line"><a name="l16654"></a><span class="lineno">16654</span>  <span class="comment">// Remember memory type with lowest cost.</span></div>
-<div class="line"><a name="l16655"></a><span class="lineno">16655</span>  <span class="keywordflow">if</span>(currCost < minCost)</div>
-<div class="line"><a name="l16656"></a><span class="lineno">16656</span>  {</div>
-<div class="line"><a name="l16657"></a><span class="lineno">16657</span>  *pMemoryTypeIndex = memTypeIndex;</div>
-<div class="line"><a name="l16658"></a><span class="lineno">16658</span>  <span class="keywordflow">if</span>(currCost == 0)</div>
-<div class="line"><a name="l16659"></a><span class="lineno">16659</span>  {</div>
-<div class="line"><a name="l16660"></a><span class="lineno">16660</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16661"></a><span class="lineno">16661</span>  }</div>
-<div class="line"><a name="l16662"></a><span class="lineno">16662</span>  minCost = currCost;</div>
-<div class="line"><a name="l16663"></a><span class="lineno">16663</span>  }</div>
-<div class="line"><a name="l16664"></a><span class="lineno">16664</span>  }</div>
-<div class="line"><a name="l16665"></a><span class="lineno">16665</span>  }</div>
-<div class="line"><a name="l16666"></a><span class="lineno">16666</span>  }</div>
-<div class="line"><a name="l16667"></a><span class="lineno">16667</span>  <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l16668"></a><span class="lineno">16668</span> }</div>
-<div class="line"><a name="l16669"></a><span class="lineno">16669</span>  </div>
-<div class="line"><a name="l16670"></a><span class="lineno">16670</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
-<div class="line"><a name="l16671"></a><span class="lineno">16671</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16672"></a><span class="lineno">16672</span>  <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
-<div class="line"><a name="l16673"></a><span class="lineno">16673</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l16674"></a><span class="lineno">16674</span>  uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l16675"></a><span class="lineno">16675</span> {</div>
-<div class="line"><a name="l16676"></a><span class="lineno">16676</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l16677"></a><span class="lineno">16677</span>  VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l16678"></a><span class="lineno">16678</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l16679"></a><span class="lineno">16679</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l16680"></a><span class="lineno">16680</span>  </div>
-<div class="line"><a name="l16681"></a><span class="lineno">16681</span>  <span class="keyword">const</span> VkDevice hDev = allocator->m_hDevice;</div>
-<div class="line"><a name="l16682"></a><span class="lineno">16682</span>  VkBuffer hBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l16683"></a><span class="lineno">16683</span>  VkResult res = allocator->GetVulkanFunctions().vkCreateBuffer(</div>
-<div class="line"><a name="l16684"></a><span class="lineno">16684</span>  hDev, pBufferCreateInfo, allocator->GetAllocationCallbacks(), &hBuffer);</div>
-<div class="line"><a name="l16685"></a><span class="lineno">16685</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16686"></a><span class="lineno">16686</span>  {</div>
-<div class="line"><a name="l16687"></a><span class="lineno">16687</span>  VkMemoryRequirements memReq = {};</div>
-<div class="line"><a name="l16688"></a><span class="lineno">16688</span>  allocator->GetVulkanFunctions().vkGetBufferMemoryRequirements(</div>
-<div class="line"><a name="l16689"></a><span class="lineno">16689</span>  hDev, hBuffer, &memReq);</div>
-<div class="line"><a name="l16690"></a><span class="lineno">16690</span>  </div>
-<div class="line"><a name="l16691"></a><span class="lineno">16691</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l16692"></a><span class="lineno">16692</span>  allocator,</div>
-<div class="line"><a name="l16693"></a><span class="lineno">16693</span>  memReq.memoryTypeBits,</div>
-<div class="line"><a name="l16694"></a><span class="lineno">16694</span>  pAllocationCreateInfo,</div>
-<div class="line"><a name="l16695"></a><span class="lineno">16695</span>  pMemoryTypeIndex);</div>
+<div class="line"><a name="l16635"></a><span class="lineno">16635</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>:</div>
+<div class="line"><a name="l16636"></a><span class="lineno">16636</span>  requiredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;</div>
+<div class="line"><a name="l16637"></a><span class="lineno">16637</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16638"></a><span class="lineno">16638</span>  <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l16639"></a><span class="lineno">16639</span>  VMA_ASSERT(0);</div>
+<div class="line"><a name="l16640"></a><span class="lineno">16640</span>  <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16641"></a><span class="lineno">16641</span>  }</div>
+<div class="line"><a name="l16642"></a><span class="lineno">16642</span>  </div>
+<div class="line"><a name="l16643"></a><span class="lineno">16643</span>  *pMemoryTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l16644"></a><span class="lineno">16644</span>  uint32_t minCost = UINT32_MAX;</div>
+<div class="line"><a name="l16645"></a><span class="lineno">16645</span>  <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div>
+<div class="line"><a name="l16646"></a><span class="lineno">16646</span>  memTypeIndex < allocator->GetMemoryTypeCount();</div>
+<div class="line"><a name="l16647"></a><span class="lineno">16647</span>  ++memTypeIndex, memTypeBit <<= 1)</div>
+<div class="line"><a name="l16648"></a><span class="lineno">16648</span>  {</div>
+<div class="line"><a name="l16649"></a><span class="lineno">16649</span>  <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div>
+<div class="line"><a name="l16650"></a><span class="lineno">16650</span>  <span class="keywordflow">if</span>((memTypeBit & memoryTypeBits) != 0)</div>
+<div class="line"><a name="l16651"></a><span class="lineno">16651</span>  {</div>
+<div class="line"><a name="l16652"></a><span class="lineno">16652</span>  <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div>
+<div class="line"><a name="l16653"></a><span class="lineno">16653</span>  allocator->m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l16654"></a><span class="lineno">16654</span>  <span class="comment">// This memory type contains requiredFlags.</span></div>
+<div class="line"><a name="l16655"></a><span class="lineno">16655</span>  <span class="keywordflow">if</span>((requiredFlags & ~currFlags) == 0)</div>
+<div class="line"><a name="l16656"></a><span class="lineno">16656</span>  {</div>
+<div class="line"><a name="l16657"></a><span class="lineno">16657</span>  <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div>
+<div class="line"><a name="l16658"></a><span class="lineno">16658</span>  uint32_t currCost = VmaCountBitsSet(preferredFlags & ~currFlags) +</div>
+<div class="line"><a name="l16659"></a><span class="lineno">16659</span>  VmaCountBitsSet(currFlags & notPreferredFlags);</div>
+<div class="line"><a name="l16660"></a><span class="lineno">16660</span>  <span class="comment">// Remember memory type with lowest cost.</span></div>
+<div class="line"><a name="l16661"></a><span class="lineno">16661</span>  <span class="keywordflow">if</span>(currCost < minCost)</div>
+<div class="line"><a name="l16662"></a><span class="lineno">16662</span>  {</div>
+<div class="line"><a name="l16663"></a><span class="lineno">16663</span>  *pMemoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l16664"></a><span class="lineno">16664</span>  <span class="keywordflow">if</span>(currCost == 0)</div>
+<div class="line"><a name="l16665"></a><span class="lineno">16665</span>  {</div>
+<div class="line"><a name="l16666"></a><span class="lineno">16666</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16667"></a><span class="lineno">16667</span>  }</div>
+<div class="line"><a name="l16668"></a><span class="lineno">16668</span>  minCost = currCost;</div>
+<div class="line"><a name="l16669"></a><span class="lineno">16669</span>  }</div>
+<div class="line"><a name="l16670"></a><span class="lineno">16670</span>  }</div>
+<div class="line"><a name="l16671"></a><span class="lineno">16671</span>  }</div>
+<div class="line"><a name="l16672"></a><span class="lineno">16672</span>  }</div>
+<div class="line"><a name="l16673"></a><span class="lineno">16673</span>  <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l16674"></a><span class="lineno">16674</span> }</div>
+<div class="line"><a name="l16675"></a><span class="lineno">16675</span>  </div>
+<div class="line"><a name="l16676"></a><span class="lineno">16676</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
+<div class="line"><a name="l16677"></a><span class="lineno">16677</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16678"></a><span class="lineno">16678</span>  <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l16679"></a><span class="lineno">16679</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l16680"></a><span class="lineno">16680</span>  uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16681"></a><span class="lineno">16681</span> {</div>
+<div class="line"><a name="l16682"></a><span class="lineno">16682</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16683"></a><span class="lineno">16683</span>  VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16684"></a><span class="lineno">16684</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16685"></a><span class="lineno">16685</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16686"></a><span class="lineno">16686</span>  </div>
+<div class="line"><a name="l16687"></a><span class="lineno">16687</span>  <span class="keyword">const</span> VkDevice hDev = allocator->m_hDevice;</div>
+<div class="line"><a name="l16688"></a><span class="lineno">16688</span>  VkBuffer hBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16689"></a><span class="lineno">16689</span>  VkResult res = allocator->GetVulkanFunctions().vkCreateBuffer(</div>
+<div class="line"><a name="l16690"></a><span class="lineno">16690</span>  hDev, pBufferCreateInfo, allocator->GetAllocationCallbacks(), &hBuffer);</div>
+<div class="line"><a name="l16691"></a><span class="lineno">16691</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16692"></a><span class="lineno">16692</span>  {</div>
+<div class="line"><a name="l16693"></a><span class="lineno">16693</span>  VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l16694"></a><span class="lineno">16694</span>  allocator->GetVulkanFunctions().vkGetBufferMemoryRequirements(</div>
+<div class="line"><a name="l16695"></a><span class="lineno">16695</span>  hDev, hBuffer, &memReq);</div>
<div class="line"><a name="l16696"></a><span class="lineno">16696</span>  </div>
-<div class="line"><a name="l16697"></a><span class="lineno">16697</span>  allocator->GetVulkanFunctions().vkDestroyBuffer(</div>
-<div class="line"><a name="l16698"></a><span class="lineno">16698</span>  hDev, hBuffer, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l16699"></a><span class="lineno">16699</span>  }</div>
-<div class="line"><a name="l16700"></a><span class="lineno">16700</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16701"></a><span class="lineno">16701</span> }</div>
+<div class="line"><a name="l16697"></a><span class="lineno">16697</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16698"></a><span class="lineno">16698</span>  allocator,</div>
+<div class="line"><a name="l16699"></a><span class="lineno">16699</span>  memReq.memoryTypeBits,</div>
+<div class="line"><a name="l16700"></a><span class="lineno">16700</span>  pAllocationCreateInfo,</div>
+<div class="line"><a name="l16701"></a><span class="lineno">16701</span>  pMemoryTypeIndex);</div>
<div class="line"><a name="l16702"></a><span class="lineno">16702</span>  </div>
-<div class="line"><a name="l16703"></a><span class="lineno">16703</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
-<div class="line"><a name="l16704"></a><span class="lineno">16704</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16705"></a><span class="lineno">16705</span>  <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
-<div class="line"><a name="l16706"></a><span class="lineno">16706</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l16707"></a><span class="lineno">16707</span>  uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l16708"></a><span class="lineno">16708</span> {</div>
-<div class="line"><a name="l16709"></a><span class="lineno">16709</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l16710"></a><span class="lineno">16710</span>  VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l16711"></a><span class="lineno">16711</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l16712"></a><span class="lineno">16712</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l16713"></a><span class="lineno">16713</span>  </div>
-<div class="line"><a name="l16714"></a><span class="lineno">16714</span>  <span class="keyword">const</span> VkDevice hDev = allocator->m_hDevice;</div>
-<div class="line"><a name="l16715"></a><span class="lineno">16715</span>  VkImage hImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l16716"></a><span class="lineno">16716</span>  VkResult res = allocator->GetVulkanFunctions().vkCreateImage(</div>
-<div class="line"><a name="l16717"></a><span class="lineno">16717</span>  hDev, pImageCreateInfo, allocator->GetAllocationCallbacks(), &hImage);</div>
-<div class="line"><a name="l16718"></a><span class="lineno">16718</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16719"></a><span class="lineno">16719</span>  {</div>
-<div class="line"><a name="l16720"></a><span class="lineno">16720</span>  VkMemoryRequirements memReq = {};</div>
-<div class="line"><a name="l16721"></a><span class="lineno">16721</span>  allocator->GetVulkanFunctions().vkGetImageMemoryRequirements(</div>
-<div class="line"><a name="l16722"></a><span class="lineno">16722</span>  hDev, hImage, &memReq);</div>
-<div class="line"><a name="l16723"></a><span class="lineno">16723</span>  </div>
-<div class="line"><a name="l16724"></a><span class="lineno">16724</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l16725"></a><span class="lineno">16725</span>  allocator,</div>
-<div class="line"><a name="l16726"></a><span class="lineno">16726</span>  memReq.memoryTypeBits,</div>
-<div class="line"><a name="l16727"></a><span class="lineno">16727</span>  pAllocationCreateInfo,</div>
-<div class="line"><a name="l16728"></a><span class="lineno">16728</span>  pMemoryTypeIndex);</div>
+<div class="line"><a name="l16703"></a><span class="lineno">16703</span>  allocator->GetVulkanFunctions().vkDestroyBuffer(</div>
+<div class="line"><a name="l16704"></a><span class="lineno">16704</span>  hDev, hBuffer, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l16705"></a><span class="lineno">16705</span>  }</div>
+<div class="line"><a name="l16706"></a><span class="lineno">16706</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16707"></a><span class="lineno">16707</span> }</div>
+<div class="line"><a name="l16708"></a><span class="lineno">16708</span>  </div>
+<div class="line"><a name="l16709"></a><span class="lineno">16709</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
+<div class="line"><a name="l16710"></a><span class="lineno">16710</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16711"></a><span class="lineno">16711</span>  <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l16712"></a><span class="lineno">16712</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l16713"></a><span class="lineno">16713</span>  uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l16714"></a><span class="lineno">16714</span> {</div>
+<div class="line"><a name="l16715"></a><span class="lineno">16715</span>  VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16716"></a><span class="lineno">16716</span>  VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16717"></a><span class="lineno">16717</span>  VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l16718"></a><span class="lineno">16718</span>  VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l16719"></a><span class="lineno">16719</span>  </div>
+<div class="line"><a name="l16720"></a><span class="lineno">16720</span>  <span class="keyword">const</span> VkDevice hDev = allocator->m_hDevice;</div>
+<div class="line"><a name="l16721"></a><span class="lineno">16721</span>  VkImage hImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16722"></a><span class="lineno">16722</span>  VkResult res = allocator->GetVulkanFunctions().vkCreateImage(</div>
+<div class="line"><a name="l16723"></a><span class="lineno">16723</span>  hDev, pImageCreateInfo, allocator->GetAllocationCallbacks(), &hImage);</div>
+<div class="line"><a name="l16724"></a><span class="lineno">16724</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16725"></a><span class="lineno">16725</span>  {</div>
+<div class="line"><a name="l16726"></a><span class="lineno">16726</span>  VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l16727"></a><span class="lineno">16727</span>  allocator->GetVulkanFunctions().vkGetImageMemoryRequirements(</div>
+<div class="line"><a name="l16728"></a><span class="lineno">16728</span>  hDev, hImage, &memReq);</div>
<div class="line"><a name="l16729"></a><span class="lineno">16729</span>  </div>
-<div class="line"><a name="l16730"></a><span class="lineno">16730</span>  allocator->GetVulkanFunctions().vkDestroyImage(</div>
-<div class="line"><a name="l16731"></a><span class="lineno">16731</span>  hDev, hImage, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l16732"></a><span class="lineno">16732</span>  }</div>
-<div class="line"><a name="l16733"></a><span class="lineno">16733</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16734"></a><span class="lineno">16734</span> }</div>
+<div class="line"><a name="l16730"></a><span class="lineno">16730</span>  res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l16731"></a><span class="lineno">16731</span>  allocator,</div>
+<div class="line"><a name="l16732"></a><span class="lineno">16732</span>  memReq.memoryTypeBits,</div>
+<div class="line"><a name="l16733"></a><span class="lineno">16733</span>  pAllocationCreateInfo,</div>
+<div class="line"><a name="l16734"></a><span class="lineno">16734</span>  pMemoryTypeIndex);</div>
<div class="line"><a name="l16735"></a><span class="lineno">16735</span>  </div>
-<div class="line"><a name="l16736"></a><span class="lineno">16736</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
-<div class="line"><a name="l16737"></a><span class="lineno">16737</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16738"></a><span class="lineno">16738</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l16739"></a><span class="lineno">16739</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
-<div class="line"><a name="l16740"></a><span class="lineno">16740</span> {</div>
-<div class="line"><a name="l16741"></a><span class="lineno">16741</span>  VMA_ASSERT(allocator && pCreateInfo && pPool);</div>
-<div class="line"><a name="l16742"></a><span class="lineno">16742</span>  </div>
-<div class="line"><a name="l16743"></a><span class="lineno">16743</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreatePool"</span>);</div>
-<div class="line"><a name="l16744"></a><span class="lineno">16744</span>  </div>
-<div class="line"><a name="l16745"></a><span class="lineno">16745</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16746"></a><span class="lineno">16746</span>  </div>
-<div class="line"><a name="l16747"></a><span class="lineno">16747</span>  VkResult res = allocator->CreatePool(pCreateInfo, pPool);</div>
+<div class="line"><a name="l16736"></a><span class="lineno">16736</span>  allocator->GetVulkanFunctions().vkDestroyImage(</div>
+<div class="line"><a name="l16737"></a><span class="lineno">16737</span>  hDev, hImage, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l16738"></a><span class="lineno">16738</span>  }</div>
+<div class="line"><a name="l16739"></a><span class="lineno">16739</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16740"></a><span class="lineno">16740</span> }</div>
+<div class="line"><a name="l16741"></a><span class="lineno">16741</span>  </div>
+<div class="line"><a name="l16742"></a><span class="lineno">16742</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
+<div class="line"><a name="l16743"></a><span class="lineno">16743</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16744"></a><span class="lineno">16744</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l16745"></a><span class="lineno">16745</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
+<div class="line"><a name="l16746"></a><span class="lineno">16746</span> {</div>
+<div class="line"><a name="l16747"></a><span class="lineno">16747</span>  VMA_ASSERT(allocator && pCreateInfo && pPool);</div>
<div class="line"><a name="l16748"></a><span class="lineno">16748</span>  </div>
-<div class="line"><a name="l16749"></a><span class="lineno">16749</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16750"></a><span class="lineno">16750</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16751"></a><span class="lineno">16751</span>  {</div>
-<div class="line"><a name="l16752"></a><span class="lineno">16752</span>  allocator->GetRecorder()->RecordCreatePool(allocator->GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div>
-<div class="line"><a name="l16753"></a><span class="lineno">16753</span>  }</div>
-<div class="line"><a name="l16754"></a><span class="lineno">16754</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16755"></a><span class="lineno">16755</span>  </div>
-<div class="line"><a name="l16756"></a><span class="lineno">16756</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16757"></a><span class="lineno">16757</span> }</div>
-<div class="line"><a name="l16758"></a><span class="lineno">16758</span>  </div>
-<div class="line"><a name="l16759"></a><span class="lineno">16759</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
-<div class="line"><a name="l16760"></a><span class="lineno">16760</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16761"></a><span class="lineno">16761</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l16762"></a><span class="lineno">16762</span> {</div>
-<div class="line"><a name="l16763"></a><span class="lineno">16763</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l16764"></a><span class="lineno">16764</span>  </div>
-<div class="line"><a name="l16765"></a><span class="lineno">16765</span>  <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16766"></a><span class="lineno">16766</span>  {</div>
-<div class="line"><a name="l16767"></a><span class="lineno">16767</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l16768"></a><span class="lineno">16768</span>  }</div>
-<div class="line"><a name="l16769"></a><span class="lineno">16769</span>  </div>
-<div class="line"><a name="l16770"></a><span class="lineno">16770</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyPool"</span>);</div>
-<div class="line"><a name="l16771"></a><span class="lineno">16771</span>  </div>
-<div class="line"><a name="l16772"></a><span class="lineno">16772</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16773"></a><span class="lineno">16773</span>  </div>
-<div class="line"><a name="l16774"></a><span class="lineno">16774</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16775"></a><span class="lineno">16775</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16776"></a><span class="lineno">16776</span>  {</div>
-<div class="line"><a name="l16777"></a><span class="lineno">16777</span>  allocator->GetRecorder()->RecordDestroyPool(allocator->GetCurrentFrameIndex(), pool);</div>
-<div class="line"><a name="l16778"></a><span class="lineno">16778</span>  }</div>
-<div class="line"><a name="l16779"></a><span class="lineno">16779</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16780"></a><span class="lineno">16780</span>  </div>
-<div class="line"><a name="l16781"></a><span class="lineno">16781</span>  allocator->DestroyPool(pool);</div>
-<div class="line"><a name="l16782"></a><span class="lineno">16782</span> }</div>
-<div class="line"><a name="l16783"></a><span class="lineno">16783</span>  </div>
-<div class="line"><a name="l16784"></a><span class="lineno">16784</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
-<div class="line"><a name="l16785"></a><span class="lineno">16785</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16786"></a><span class="lineno">16786</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l16787"></a><span class="lineno">16787</span>  <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
-<div class="line"><a name="l16788"></a><span class="lineno">16788</span> {</div>
-<div class="line"><a name="l16789"></a><span class="lineno">16789</span>  VMA_ASSERT(allocator && pool && pPoolStats);</div>
-<div class="line"><a name="l16790"></a><span class="lineno">16790</span>  </div>
-<div class="line"><a name="l16791"></a><span class="lineno">16791</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16792"></a><span class="lineno">16792</span>  </div>
-<div class="line"><a name="l16793"></a><span class="lineno">16793</span>  allocator->GetPoolStats(pool, pPoolStats);</div>
-<div class="line"><a name="l16794"></a><span class="lineno">16794</span> }</div>
-<div class="line"><a name="l16795"></a><span class="lineno">16795</span>  </div>
-<div class="line"><a name="l16796"></a><span class="lineno">16796</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
-<div class="line"><a name="l16797"></a><span class="lineno">16797</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16798"></a><span class="lineno">16798</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l16799"></a><span class="lineno">16799</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l16800"></a><span class="lineno">16800</span> {</div>
-<div class="line"><a name="l16801"></a><span class="lineno">16801</span>  VMA_ASSERT(allocator && pool);</div>
-<div class="line"><a name="l16802"></a><span class="lineno">16802</span>  </div>
-<div class="line"><a name="l16803"></a><span class="lineno">16803</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16804"></a><span class="lineno">16804</span>  </div>
-<div class="line"><a name="l16805"></a><span class="lineno">16805</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16806"></a><span class="lineno">16806</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16807"></a><span class="lineno">16807</span>  {</div>
-<div class="line"><a name="l16808"></a><span class="lineno">16808</span>  allocator->GetRecorder()->RecordMakePoolAllocationsLost(allocator->GetCurrentFrameIndex(), pool);</div>
-<div class="line"><a name="l16809"></a><span class="lineno">16809</span>  }</div>
-<div class="line"><a name="l16810"></a><span class="lineno">16810</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16811"></a><span class="lineno">16811</span>  </div>
-<div class="line"><a name="l16812"></a><span class="lineno">16812</span>  allocator->MakePoolAllocationsLost(pool, pLostAllocationCount);</div>
-<div class="line"><a name="l16813"></a><span class="lineno">16813</span> }</div>
-<div class="line"><a name="l16814"></a><span class="lineno">16814</span>  </div>
-<div class="line"><a name="l16815"></a><span class="lineno">16815</span> VMA_CALL_PRE VkResult VMA_CALL_POST <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="l16816"></a><span class="lineno">16816</span> {</div>
-<div class="line"><a name="l16817"></a><span class="lineno">16817</span>  VMA_ASSERT(allocator && pool);</div>
-<div class="line"><a name="l16818"></a><span class="lineno">16818</span>  </div>
-<div class="line"><a name="l16819"></a><span class="lineno">16819</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16749"></a><span class="lineno">16749</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreatePool"</span>);</div>
+<div class="line"><a name="l16750"></a><span class="lineno">16750</span>  </div>
+<div class="line"><a name="l16751"></a><span class="lineno">16751</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16752"></a><span class="lineno">16752</span>  </div>
+<div class="line"><a name="l16753"></a><span class="lineno">16753</span>  VkResult res = allocator->CreatePool(pCreateInfo, pPool);</div>
+<div class="line"><a name="l16754"></a><span class="lineno">16754</span>  </div>
+<div class="line"><a name="l16755"></a><span class="lineno">16755</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16756"></a><span class="lineno">16756</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16757"></a><span class="lineno">16757</span>  {</div>
+<div class="line"><a name="l16758"></a><span class="lineno">16758</span>  allocator->GetRecorder()->RecordCreatePool(allocator->GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div>
+<div class="line"><a name="l16759"></a><span class="lineno">16759</span>  }</div>
+<div class="line"><a name="l16760"></a><span class="lineno">16760</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16761"></a><span class="lineno">16761</span>  </div>
+<div class="line"><a name="l16762"></a><span class="lineno">16762</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16763"></a><span class="lineno">16763</span> }</div>
+<div class="line"><a name="l16764"></a><span class="lineno">16764</span>  </div>
+<div class="line"><a name="l16765"></a><span class="lineno">16765</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
+<div class="line"><a name="l16766"></a><span class="lineno">16766</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16767"></a><span class="lineno">16767</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l16768"></a><span class="lineno">16768</span> {</div>
+<div class="line"><a name="l16769"></a><span class="lineno">16769</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l16770"></a><span class="lineno">16770</span>  </div>
+<div class="line"><a name="l16771"></a><span class="lineno">16771</span>  <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16772"></a><span class="lineno">16772</span>  {</div>
+<div class="line"><a name="l16773"></a><span class="lineno">16773</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l16774"></a><span class="lineno">16774</span>  }</div>
+<div class="line"><a name="l16775"></a><span class="lineno">16775</span>  </div>
+<div class="line"><a name="l16776"></a><span class="lineno">16776</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyPool"</span>);</div>
+<div class="line"><a name="l16777"></a><span class="lineno">16777</span>  </div>
+<div class="line"><a name="l16778"></a><span class="lineno">16778</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16779"></a><span class="lineno">16779</span>  </div>
+<div class="line"><a name="l16780"></a><span class="lineno">16780</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16781"></a><span class="lineno">16781</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16782"></a><span class="lineno">16782</span>  {</div>
+<div class="line"><a name="l16783"></a><span class="lineno">16783</span>  allocator->GetRecorder()->RecordDestroyPool(allocator->GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l16784"></a><span class="lineno">16784</span>  }</div>
+<div class="line"><a name="l16785"></a><span class="lineno">16785</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16786"></a><span class="lineno">16786</span>  </div>
+<div class="line"><a name="l16787"></a><span class="lineno">16787</span>  allocator->DestroyPool(pool);</div>
+<div class="line"><a name="l16788"></a><span class="lineno">16788</span> }</div>
+<div class="line"><a name="l16789"></a><span class="lineno">16789</span>  </div>
+<div class="line"><a name="l16790"></a><span class="lineno">16790</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
+<div class="line"><a name="l16791"></a><span class="lineno">16791</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16792"></a><span class="lineno">16792</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16793"></a><span class="lineno">16793</span>  <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
+<div class="line"><a name="l16794"></a><span class="lineno">16794</span> {</div>
+<div class="line"><a name="l16795"></a><span class="lineno">16795</span>  VMA_ASSERT(allocator && pool && pPoolStats);</div>
+<div class="line"><a name="l16796"></a><span class="lineno">16796</span>  </div>
+<div class="line"><a name="l16797"></a><span class="lineno">16797</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16798"></a><span class="lineno">16798</span>  </div>
+<div class="line"><a name="l16799"></a><span class="lineno">16799</span>  allocator->GetPoolStats(pool, pPoolStats);</div>
+<div class="line"><a name="l16800"></a><span class="lineno">16800</span> }</div>
+<div class="line"><a name="l16801"></a><span class="lineno">16801</span>  </div>
+<div class="line"><a name="l16802"></a><span class="lineno">16802</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
+<div class="line"><a name="l16803"></a><span class="lineno">16803</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16804"></a><span class="lineno">16804</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16805"></a><span class="lineno">16805</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l16806"></a><span class="lineno">16806</span> {</div>
+<div class="line"><a name="l16807"></a><span class="lineno">16807</span>  VMA_ASSERT(allocator && pool);</div>
+<div class="line"><a name="l16808"></a><span class="lineno">16808</span>  </div>
+<div class="line"><a name="l16809"></a><span class="lineno">16809</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16810"></a><span class="lineno">16810</span>  </div>
+<div class="line"><a name="l16811"></a><span class="lineno">16811</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16812"></a><span class="lineno">16812</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16813"></a><span class="lineno">16813</span>  {</div>
+<div class="line"><a name="l16814"></a><span class="lineno">16814</span>  allocator->GetRecorder()->RecordMakePoolAllocationsLost(allocator->GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l16815"></a><span class="lineno">16815</span>  }</div>
+<div class="line"><a name="l16816"></a><span class="lineno">16816</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16817"></a><span class="lineno">16817</span>  </div>
+<div class="line"><a name="l16818"></a><span class="lineno">16818</span>  allocator->MakePoolAllocationsLost(pool, pLostAllocationCount);</div>
+<div class="line"><a name="l16819"></a><span class="lineno">16819</span> }</div>
<div class="line"><a name="l16820"></a><span class="lineno">16820</span>  </div>
-<div class="line"><a name="l16821"></a><span class="lineno">16821</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCheckPoolCorruption"</span>);</div>
-<div class="line"><a name="l16822"></a><span class="lineno">16822</span>  </div>
-<div class="line"><a name="l16823"></a><span class="lineno">16823</span>  <span class="keywordflow">return</span> allocator->CheckPoolCorruption(pool);</div>
-<div class="line"><a name="l16824"></a><span class="lineno">16824</span> }</div>
-<div class="line"><a name="l16825"></a><span class="lineno">16825</span>  </div>
-<div class="line"><a name="l16826"></a><span class="lineno">16826</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
-<div class="line"><a name="l16827"></a><span class="lineno">16827</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16828"></a><span class="lineno">16828</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l16829"></a><span class="lineno">16829</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>** ppName)</div>
-<div class="line"><a name="l16830"></a><span class="lineno">16830</span> {</div>
-<div class="line"><a name="l16831"></a><span class="lineno">16831</span>  VMA_ASSERT(allocator && pool);</div>
-<div class="line"><a name="l16832"></a><span class="lineno">16832</span>  </div>
-<div class="line"><a name="l16833"></a><span class="lineno">16833</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaGetPoolName"</span>);</div>
-<div class="line"><a name="l16834"></a><span class="lineno">16834</span>  </div>
-<div class="line"><a name="l16835"></a><span class="lineno">16835</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16836"></a><span class="lineno">16836</span>  </div>
-<div class="line"><a name="l16837"></a><span class="lineno">16837</span>  *ppName = pool->GetName();</div>
-<div class="line"><a name="l16838"></a><span class="lineno">16838</span> }</div>
-<div class="line"><a name="l16839"></a><span class="lineno">16839</span>  </div>
-<div class="line"><a name="l16840"></a><span class="lineno">16840</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
-<div class="line"><a name="l16841"></a><span class="lineno">16841</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16842"></a><span class="lineno">16842</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l16843"></a><span class="lineno">16843</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
-<div class="line"><a name="l16844"></a><span class="lineno">16844</span> {</div>
-<div class="line"><a name="l16845"></a><span class="lineno">16845</span>  VMA_ASSERT(allocator && pool);</div>
-<div class="line"><a name="l16846"></a><span class="lineno">16846</span>  </div>
-<div class="line"><a name="l16847"></a><span class="lineno">16847</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaSetPoolName"</span>);</div>
-<div class="line"><a name="l16848"></a><span class="lineno">16848</span>  </div>
-<div class="line"><a name="l16849"></a><span class="lineno">16849</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16850"></a><span class="lineno">16850</span>  </div>
-<div class="line"><a name="l16851"></a><span class="lineno">16851</span>  pool->SetName(pName);</div>
+<div class="line"><a name="l16821"></a><span class="lineno">16821</span> VMA_CALL_PRE VkResult VMA_CALL_POST <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="l16822"></a><span class="lineno">16822</span> {</div>
+<div class="line"><a name="l16823"></a><span class="lineno">16823</span>  VMA_ASSERT(allocator && pool);</div>
+<div class="line"><a name="l16824"></a><span class="lineno">16824</span>  </div>
+<div class="line"><a name="l16825"></a><span class="lineno">16825</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16826"></a><span class="lineno">16826</span>  </div>
+<div class="line"><a name="l16827"></a><span class="lineno">16827</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCheckPoolCorruption"</span>);</div>
+<div class="line"><a name="l16828"></a><span class="lineno">16828</span>  </div>
+<div class="line"><a name="l16829"></a><span class="lineno">16829</span>  <span class="keywordflow">return</span> allocator->CheckPoolCorruption(pool);</div>
+<div class="line"><a name="l16830"></a><span class="lineno">16830</span> }</div>
+<div class="line"><a name="l16831"></a><span class="lineno">16831</span>  </div>
+<div class="line"><a name="l16832"></a><span class="lineno">16832</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
+<div class="line"><a name="l16833"></a><span class="lineno">16833</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16834"></a><span class="lineno">16834</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16835"></a><span class="lineno">16835</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>** ppName)</div>
+<div class="line"><a name="l16836"></a><span class="lineno">16836</span> {</div>
+<div class="line"><a name="l16837"></a><span class="lineno">16837</span>  VMA_ASSERT(allocator && pool);</div>
+<div class="line"><a name="l16838"></a><span class="lineno">16838</span>  </div>
+<div class="line"><a name="l16839"></a><span class="lineno">16839</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaGetPoolName"</span>);</div>
+<div class="line"><a name="l16840"></a><span class="lineno">16840</span>  </div>
+<div class="line"><a name="l16841"></a><span class="lineno">16841</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16842"></a><span class="lineno">16842</span>  </div>
+<div class="line"><a name="l16843"></a><span class="lineno">16843</span>  *ppName = pool->GetName();</div>
+<div class="line"><a name="l16844"></a><span class="lineno">16844</span> }</div>
+<div class="line"><a name="l16845"></a><span class="lineno">16845</span>  </div>
+<div class="line"><a name="l16846"></a><span class="lineno">16846</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
+<div class="line"><a name="l16847"></a><span class="lineno">16847</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16848"></a><span class="lineno">16848</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l16849"></a><span class="lineno">16849</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
+<div class="line"><a name="l16850"></a><span class="lineno">16850</span> {</div>
+<div class="line"><a name="l16851"></a><span class="lineno">16851</span>  VMA_ASSERT(allocator && pool);</div>
<div class="line"><a name="l16852"></a><span class="lineno">16852</span>  </div>
-<div class="line"><a name="l16853"></a><span class="lineno">16853</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16854"></a><span class="lineno">16854</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16855"></a><span class="lineno">16855</span>  {</div>
-<div class="line"><a name="l16856"></a><span class="lineno">16856</span>  allocator->GetRecorder()->RecordSetPoolName(allocator->GetCurrentFrameIndex(), pool, pName);</div>
-<div class="line"><a name="l16857"></a><span class="lineno">16857</span>  }</div>
-<div class="line"><a name="l16858"></a><span class="lineno">16858</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16859"></a><span class="lineno">16859</span> }</div>
-<div class="line"><a name="l16860"></a><span class="lineno">16860</span>  </div>
-<div class="line"><a name="l16861"></a><span class="lineno">16861</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
-<div class="line"><a name="l16862"></a><span class="lineno">16862</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16863"></a><span class="lineno">16863</span>  <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
-<div class="line"><a name="l16864"></a><span class="lineno">16864</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l16865"></a><span class="lineno">16865</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l16866"></a><span class="lineno">16866</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l16867"></a><span class="lineno">16867</span> {</div>
-<div class="line"><a name="l16868"></a><span class="lineno">16868</span>  VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocation);</div>
-<div class="line"><a name="l16869"></a><span class="lineno">16869</span>  </div>
-<div class="line"><a name="l16870"></a><span class="lineno">16870</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemory"</span>);</div>
-<div class="line"><a name="l16871"></a><span class="lineno">16871</span>  </div>
-<div class="line"><a name="l16872"></a><span class="lineno">16872</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16873"></a><span class="lineno">16873</span>  </div>
-<div class="line"><a name="l16874"></a><span class="lineno">16874</span>  VkResult result = allocator->AllocateMemory(</div>
-<div class="line"><a name="l16875"></a><span class="lineno">16875</span>  *pVkMemoryRequirements,</div>
-<div class="line"><a name="l16876"></a><span class="lineno">16876</span>  <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
-<div class="line"><a name="l16877"></a><span class="lineno">16877</span>  <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
-<div class="line"><a name="l16878"></a><span class="lineno">16878</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l16879"></a><span class="lineno">16879</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l16880"></a><span class="lineno">16880</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16881"></a><span class="lineno">16881</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
-<div class="line"><a name="l16882"></a><span class="lineno">16882</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l16883"></a><span class="lineno">16883</span>  pAllocation);</div>
-<div class="line"><a name="l16884"></a><span class="lineno">16884</span>  </div>
-<div class="line"><a name="l16885"></a><span class="lineno">16885</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16886"></a><span class="lineno">16886</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16887"></a><span class="lineno">16887</span>  {</div>
-<div class="line"><a name="l16888"></a><span class="lineno">16888</span>  allocator->GetRecorder()->RecordAllocateMemory(</div>
-<div class="line"><a name="l16889"></a><span class="lineno">16889</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l16890"></a><span class="lineno">16890</span>  *pVkMemoryRequirements,</div>
-<div class="line"><a name="l16891"></a><span class="lineno">16891</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16892"></a><span class="lineno">16892</span>  *pAllocation);</div>
-<div class="line"><a name="l16893"></a><span class="lineno">16893</span>  }</div>
-<div class="line"><a name="l16894"></a><span class="lineno">16894</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16895"></a><span class="lineno">16895</span>  </div>
-<div class="line"><a name="l16896"></a><span class="lineno">16896</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)</div>
-<div class="line"><a name="l16897"></a><span class="lineno">16897</span>  {</div>
-<div class="line"><a name="l16898"></a><span class="lineno">16898</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16853"></a><span class="lineno">16853</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaSetPoolName"</span>);</div>
+<div class="line"><a name="l16854"></a><span class="lineno">16854</span>  </div>
+<div class="line"><a name="l16855"></a><span class="lineno">16855</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16856"></a><span class="lineno">16856</span>  </div>
+<div class="line"><a name="l16857"></a><span class="lineno">16857</span>  pool->SetName(pName);</div>
+<div class="line"><a name="l16858"></a><span class="lineno">16858</span>  </div>
+<div class="line"><a name="l16859"></a><span class="lineno">16859</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16860"></a><span class="lineno">16860</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16861"></a><span class="lineno">16861</span>  {</div>
+<div class="line"><a name="l16862"></a><span class="lineno">16862</span>  allocator->GetRecorder()->RecordSetPoolName(allocator->GetCurrentFrameIndex(), pool, pName);</div>
+<div class="line"><a name="l16863"></a><span class="lineno">16863</span>  }</div>
+<div class="line"><a name="l16864"></a><span class="lineno">16864</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16865"></a><span class="lineno">16865</span> }</div>
+<div class="line"><a name="l16866"></a><span class="lineno">16866</span>  </div>
+<div class="line"><a name="l16867"></a><span class="lineno">16867</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
+<div class="line"><a name="l16868"></a><span class="lineno">16868</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16869"></a><span class="lineno">16869</span>  <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l16870"></a><span class="lineno">16870</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l16871"></a><span class="lineno">16871</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l16872"></a><span class="lineno">16872</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16873"></a><span class="lineno">16873</span> {</div>
+<div class="line"><a name="l16874"></a><span class="lineno">16874</span>  VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocation);</div>
+<div class="line"><a name="l16875"></a><span class="lineno">16875</span>  </div>
+<div class="line"><a name="l16876"></a><span class="lineno">16876</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemory"</span>);</div>
+<div class="line"><a name="l16877"></a><span class="lineno">16877</span>  </div>
+<div class="line"><a name="l16878"></a><span class="lineno">16878</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16879"></a><span class="lineno">16879</span>  </div>
+<div class="line"><a name="l16880"></a><span class="lineno">16880</span>  VkResult result = allocator->AllocateMemory(</div>
+<div class="line"><a name="l16881"></a><span class="lineno">16881</span>  *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16882"></a><span class="lineno">16882</span>  <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l16883"></a><span class="lineno">16883</span>  <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l16884"></a><span class="lineno">16884</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16885"></a><span class="lineno">16885</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16886"></a><span class="lineno">16886</span>  *pCreateInfo,</div>
+<div class="line"><a name="l16887"></a><span class="lineno">16887</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l16888"></a><span class="lineno">16888</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16889"></a><span class="lineno">16889</span>  pAllocation);</div>
+<div class="line"><a name="l16890"></a><span class="lineno">16890</span>  </div>
+<div class="line"><a name="l16891"></a><span class="lineno">16891</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16892"></a><span class="lineno">16892</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16893"></a><span class="lineno">16893</span>  {</div>
+<div class="line"><a name="l16894"></a><span class="lineno">16894</span>  allocator->GetRecorder()->RecordAllocateMemory(</div>
+<div class="line"><a name="l16895"></a><span class="lineno">16895</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16896"></a><span class="lineno">16896</span>  *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16897"></a><span class="lineno">16897</span>  *pCreateInfo,</div>
+<div class="line"><a name="l16898"></a><span class="lineno">16898</span>  *pAllocation);</div>
<div class="line"><a name="l16899"></a><span class="lineno">16899</span>  }</div>
-<div class="line"><a name="l16900"></a><span class="lineno">16900</span>  </div>
-<div class="line"><a name="l16901"></a><span class="lineno">16901</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l16902"></a><span class="lineno">16902</span> }</div>
-<div class="line"><a name="l16903"></a><span class="lineno">16903</span>  </div>
-<div class="line"><a name="l16904"></a><span class="lineno">16904</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
-<div class="line"><a name="l16905"></a><span class="lineno">16905</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16906"></a><span class="lineno">16906</span>  <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
-<div class="line"><a name="l16907"></a><span class="lineno">16907</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l16908"></a><span class="lineno">16908</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l16909"></a><span class="lineno">16909</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l16910"></a><span class="lineno">16910</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l16911"></a><span class="lineno">16911</span> {</div>
-<div class="line"><a name="l16912"></a><span class="lineno">16912</span>  <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l16913"></a><span class="lineno">16913</span>  {</div>
-<div class="line"><a name="l16914"></a><span class="lineno">16914</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16915"></a><span class="lineno">16915</span>  }</div>
-<div class="line"><a name="l16916"></a><span class="lineno">16916</span>  </div>
-<div class="line"><a name="l16917"></a><span class="lineno">16917</span>  VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocations);</div>
-<div class="line"><a name="l16918"></a><span class="lineno">16918</span>  </div>
-<div class="line"><a name="l16919"></a><span class="lineno">16919</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryPages"</span>);</div>
-<div class="line"><a name="l16920"></a><span class="lineno">16920</span>  </div>
-<div class="line"><a name="l16921"></a><span class="lineno">16921</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16900"></a><span class="lineno">16900</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16901"></a><span class="lineno">16901</span>  </div>
+<div class="line"><a name="l16902"></a><span class="lineno">16902</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)</div>
+<div class="line"><a name="l16903"></a><span class="lineno">16903</span>  {</div>
+<div class="line"><a name="l16904"></a><span class="lineno">16904</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16905"></a><span class="lineno">16905</span>  }</div>
+<div class="line"><a name="l16906"></a><span class="lineno">16906</span>  </div>
+<div class="line"><a name="l16907"></a><span class="lineno">16907</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16908"></a><span class="lineno">16908</span> }</div>
+<div class="line"><a name="l16909"></a><span class="lineno">16909</span>  </div>
+<div class="line"><a name="l16910"></a><span class="lineno">16910</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
+<div class="line"><a name="l16911"></a><span class="lineno">16911</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16912"></a><span class="lineno">16912</span>  <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l16913"></a><span class="lineno">16913</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l16914"></a><span class="lineno">16914</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16915"></a><span class="lineno">16915</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l16916"></a><span class="lineno">16916</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16917"></a><span class="lineno">16917</span> {</div>
+<div class="line"><a name="l16918"></a><span class="lineno">16918</span>  <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l16919"></a><span class="lineno">16919</span>  {</div>
+<div class="line"><a name="l16920"></a><span class="lineno">16920</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16921"></a><span class="lineno">16921</span>  }</div>
<div class="line"><a name="l16922"></a><span class="lineno">16922</span>  </div>
-<div class="line"><a name="l16923"></a><span class="lineno">16923</span>  VkResult result = allocator->AllocateMemory(</div>
-<div class="line"><a name="l16924"></a><span class="lineno">16924</span>  *pVkMemoryRequirements,</div>
-<div class="line"><a name="l16925"></a><span class="lineno">16925</span>  <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
-<div class="line"><a name="l16926"></a><span class="lineno">16926</span>  <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
-<div class="line"><a name="l16927"></a><span class="lineno">16927</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l16928"></a><span class="lineno">16928</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l16929"></a><span class="lineno">16929</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16930"></a><span class="lineno">16930</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
-<div class="line"><a name="l16931"></a><span class="lineno">16931</span>  allocationCount,</div>
-<div class="line"><a name="l16932"></a><span class="lineno">16932</span>  pAllocations);</div>
-<div class="line"><a name="l16933"></a><span class="lineno">16933</span>  </div>
-<div class="line"><a name="l16934"></a><span class="lineno">16934</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16935"></a><span class="lineno">16935</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16936"></a><span class="lineno">16936</span>  {</div>
-<div class="line"><a name="l16937"></a><span class="lineno">16937</span>  allocator->GetRecorder()->RecordAllocateMemoryPages(</div>
-<div class="line"><a name="l16938"></a><span class="lineno">16938</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l16939"></a><span class="lineno">16939</span>  *pVkMemoryRequirements,</div>
-<div class="line"><a name="l16940"></a><span class="lineno">16940</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16941"></a><span class="lineno">16941</span>  (uint64_t)allocationCount,</div>
-<div class="line"><a name="l16942"></a><span class="lineno">16942</span>  pAllocations);</div>
-<div class="line"><a name="l16943"></a><span class="lineno">16943</span>  }</div>
-<div class="line"><a name="l16944"></a><span class="lineno">16944</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16945"></a><span class="lineno">16945</span>  </div>
-<div class="line"><a name="l16946"></a><span class="lineno">16946</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)</div>
-<div class="line"><a name="l16947"></a><span class="lineno">16947</span>  {</div>
-<div class="line"><a name="l16948"></a><span class="lineno">16948</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < allocationCount; ++i)</div>
-<div class="line"><a name="l16949"></a><span class="lineno">16949</span>  {</div>
-<div class="line"><a name="l16950"></a><span class="lineno">16950</span>  allocator->GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div>
-<div class="line"><a name="l16951"></a><span class="lineno">16951</span>  }</div>
-<div class="line"><a name="l16952"></a><span class="lineno">16952</span>  }</div>
-<div class="line"><a name="l16953"></a><span class="lineno">16953</span>  </div>
-<div class="line"><a name="l16954"></a><span class="lineno">16954</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l16955"></a><span class="lineno">16955</span> }</div>
-<div class="line"><a name="l16956"></a><span class="lineno">16956</span>  </div>
-<div class="line"><a name="l16957"></a><span class="lineno">16957</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
-<div class="line"><a name="l16958"></a><span class="lineno">16958</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l16959"></a><span class="lineno">16959</span>  VkBuffer buffer,</div>
-<div class="line"><a name="l16960"></a><span class="lineno">16960</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l16961"></a><span class="lineno">16961</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l16962"></a><span class="lineno">16962</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l16963"></a><span class="lineno">16963</span> {</div>
-<div class="line"><a name="l16964"></a><span class="lineno">16964</span>  VMA_ASSERT(allocator && buffer != VK_NULL_HANDLE && pCreateInfo && pAllocation);</div>
-<div class="line"><a name="l16965"></a><span class="lineno">16965</span>  </div>
-<div class="line"><a name="l16966"></a><span class="lineno">16966</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryForBuffer"</span>);</div>
-<div class="line"><a name="l16967"></a><span class="lineno">16967</span>  </div>
-<div class="line"><a name="l16968"></a><span class="lineno">16968</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l16969"></a><span class="lineno">16969</span>  </div>
-<div class="line"><a name="l16970"></a><span class="lineno">16970</span>  VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l16971"></a><span class="lineno">16971</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16972"></a><span class="lineno">16972</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16973"></a><span class="lineno">16973</span>  allocator->GetBufferMemoryRequirements(buffer, vkMemReq,</div>
-<div class="line"><a name="l16974"></a><span class="lineno">16974</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16975"></a><span class="lineno">16975</span>  prefersDedicatedAllocation);</div>
-<div class="line"><a name="l16976"></a><span class="lineno">16976</span>  </div>
-<div class="line"><a name="l16977"></a><span class="lineno">16977</span>  VkResult result = allocator->AllocateMemory(</div>
-<div class="line"><a name="l16978"></a><span class="lineno">16978</span>  vkMemReq,</div>
-<div class="line"><a name="l16979"></a><span class="lineno">16979</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16980"></a><span class="lineno">16980</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l16981"></a><span class="lineno">16981</span>  buffer, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l16982"></a><span class="lineno">16982</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l16983"></a><span class="lineno">16983</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16984"></a><span class="lineno">16984</span>  VMA_SUBALLOCATION_TYPE_BUFFER,</div>
-<div class="line"><a name="l16985"></a><span class="lineno">16985</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l16986"></a><span class="lineno">16986</span>  pAllocation);</div>
-<div class="line"><a name="l16987"></a><span class="lineno">16987</span>  </div>
-<div class="line"><a name="l16988"></a><span class="lineno">16988</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l16989"></a><span class="lineno">16989</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l16990"></a><span class="lineno">16990</span>  {</div>
-<div class="line"><a name="l16991"></a><span class="lineno">16991</span>  allocator->GetRecorder()->RecordAllocateMemoryForBuffer(</div>
-<div class="line"><a name="l16992"></a><span class="lineno">16992</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l16993"></a><span class="lineno">16993</span>  vkMemReq,</div>
-<div class="line"><a name="l16994"></a><span class="lineno">16994</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16995"></a><span class="lineno">16995</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l16996"></a><span class="lineno">16996</span>  *pCreateInfo,</div>
-<div class="line"><a name="l16997"></a><span class="lineno">16997</span>  *pAllocation);</div>
-<div class="line"><a name="l16998"></a><span class="lineno">16998</span>  }</div>
-<div class="line"><a name="l16999"></a><span class="lineno">16999</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17000"></a><span class="lineno">17000</span>  </div>
-<div class="line"><a name="l17001"></a><span class="lineno">17001</span>  <span class="keywordflow">if</span>(pAllocationInfo && result == VK_SUCCESS)</div>
-<div class="line"><a name="l17002"></a><span class="lineno">17002</span>  {</div>
-<div class="line"><a name="l17003"></a><span class="lineno">17003</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l16923"></a><span class="lineno">16923</span>  VMA_ASSERT(allocator && pVkMemoryRequirements && pCreateInfo && pAllocations);</div>
+<div class="line"><a name="l16924"></a><span class="lineno">16924</span>  </div>
+<div class="line"><a name="l16925"></a><span class="lineno">16925</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryPages"</span>);</div>
+<div class="line"><a name="l16926"></a><span class="lineno">16926</span>  </div>
+<div class="line"><a name="l16927"></a><span class="lineno">16927</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16928"></a><span class="lineno">16928</span>  </div>
+<div class="line"><a name="l16929"></a><span class="lineno">16929</span>  VkResult result = allocator->AllocateMemory(</div>
+<div class="line"><a name="l16930"></a><span class="lineno">16930</span>  *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16931"></a><span class="lineno">16931</span>  <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l16932"></a><span class="lineno">16932</span>  <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l16933"></a><span class="lineno">16933</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16934"></a><span class="lineno">16934</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16935"></a><span class="lineno">16935</span>  *pCreateInfo,</div>
+<div class="line"><a name="l16936"></a><span class="lineno">16936</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l16937"></a><span class="lineno">16937</span>  allocationCount,</div>
+<div class="line"><a name="l16938"></a><span class="lineno">16938</span>  pAllocations);</div>
+<div class="line"><a name="l16939"></a><span class="lineno">16939</span>  </div>
+<div class="line"><a name="l16940"></a><span class="lineno">16940</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16941"></a><span class="lineno">16941</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16942"></a><span class="lineno">16942</span>  {</div>
+<div class="line"><a name="l16943"></a><span class="lineno">16943</span>  allocator->GetRecorder()->RecordAllocateMemoryPages(</div>
+<div class="line"><a name="l16944"></a><span class="lineno">16944</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16945"></a><span class="lineno">16945</span>  *pVkMemoryRequirements,</div>
+<div class="line"><a name="l16946"></a><span class="lineno">16946</span>  *pCreateInfo,</div>
+<div class="line"><a name="l16947"></a><span class="lineno">16947</span>  (uint64_t)allocationCount,</div>
+<div class="line"><a name="l16948"></a><span class="lineno">16948</span>  pAllocations);</div>
+<div class="line"><a name="l16949"></a><span class="lineno">16949</span>  }</div>
+<div class="line"><a name="l16950"></a><span class="lineno">16950</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16951"></a><span class="lineno">16951</span>  </div>
+<div class="line"><a name="l16952"></a><span class="lineno">16952</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)</div>
+<div class="line"><a name="l16953"></a><span class="lineno">16953</span>  {</div>
+<div class="line"><a name="l16954"></a><span class="lineno">16954</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < allocationCount; ++i)</div>
+<div class="line"><a name="l16955"></a><span class="lineno">16955</span>  {</div>
+<div class="line"><a name="l16956"></a><span class="lineno">16956</span>  allocator->GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div>
+<div class="line"><a name="l16957"></a><span class="lineno">16957</span>  }</div>
+<div class="line"><a name="l16958"></a><span class="lineno">16958</span>  }</div>
+<div class="line"><a name="l16959"></a><span class="lineno">16959</span>  </div>
+<div class="line"><a name="l16960"></a><span class="lineno">16960</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l16961"></a><span class="lineno">16961</span> }</div>
+<div class="line"><a name="l16962"></a><span class="lineno">16962</span>  </div>
+<div class="line"><a name="l16963"></a><span class="lineno">16963</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
+<div class="line"><a name="l16964"></a><span class="lineno">16964</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l16965"></a><span class="lineno">16965</span>  VkBuffer buffer,</div>
+<div class="line"><a name="l16966"></a><span class="lineno">16966</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l16967"></a><span class="lineno">16967</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l16968"></a><span class="lineno">16968</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l16969"></a><span class="lineno">16969</span> {</div>
+<div class="line"><a name="l16970"></a><span class="lineno">16970</span>  VMA_ASSERT(allocator && buffer != VK_NULL_HANDLE && pCreateInfo && pAllocation);</div>
+<div class="line"><a name="l16971"></a><span class="lineno">16971</span>  </div>
+<div class="line"><a name="l16972"></a><span class="lineno">16972</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryForBuffer"</span>);</div>
+<div class="line"><a name="l16973"></a><span class="lineno">16973</span>  </div>
+<div class="line"><a name="l16974"></a><span class="lineno">16974</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l16975"></a><span class="lineno">16975</span>  </div>
+<div class="line"><a name="l16976"></a><span class="lineno">16976</span>  VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l16977"></a><span class="lineno">16977</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16978"></a><span class="lineno">16978</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16979"></a><span class="lineno">16979</span>  allocator->GetBufferMemoryRequirements(buffer, vkMemReq,</div>
+<div class="line"><a name="l16980"></a><span class="lineno">16980</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16981"></a><span class="lineno">16981</span>  prefersDedicatedAllocation);</div>
+<div class="line"><a name="l16982"></a><span class="lineno">16982</span>  </div>
+<div class="line"><a name="l16983"></a><span class="lineno">16983</span>  VkResult result = allocator->AllocateMemory(</div>
+<div class="line"><a name="l16984"></a><span class="lineno">16984</span>  vkMemReq,</div>
+<div class="line"><a name="l16985"></a><span class="lineno">16985</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16986"></a><span class="lineno">16986</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16987"></a><span class="lineno">16987</span>  buffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l16988"></a><span class="lineno">16988</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l16989"></a><span class="lineno">16989</span>  *pCreateInfo,</div>
+<div class="line"><a name="l16990"></a><span class="lineno">16990</span>  VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l16991"></a><span class="lineno">16991</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l16992"></a><span class="lineno">16992</span>  pAllocation);</div>
+<div class="line"><a name="l16993"></a><span class="lineno">16993</span>  </div>
+<div class="line"><a name="l16994"></a><span class="lineno">16994</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16995"></a><span class="lineno">16995</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l16996"></a><span class="lineno">16996</span>  {</div>
+<div class="line"><a name="l16997"></a><span class="lineno">16997</span>  allocator->GetRecorder()->RecordAllocateMemoryForBuffer(</div>
+<div class="line"><a name="l16998"></a><span class="lineno">16998</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l16999"></a><span class="lineno">16999</span>  vkMemReq,</div>
+<div class="line"><a name="l17000"></a><span class="lineno">17000</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17001"></a><span class="lineno">17001</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17002"></a><span class="lineno">17002</span>  *pCreateInfo,</div>
+<div class="line"><a name="l17003"></a><span class="lineno">17003</span>  *pAllocation);</div>
<div class="line"><a name="l17004"></a><span class="lineno">17004</span>  }</div>
-<div class="line"><a name="l17005"></a><span class="lineno">17005</span>  </div>
-<div class="line"><a name="l17006"></a><span class="lineno">17006</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l17007"></a><span class="lineno">17007</span> }</div>
-<div class="line"><a name="l17008"></a><span class="lineno">17008</span>  </div>
-<div class="line"><a name="l17009"></a><span class="lineno">17009</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
-<div class="line"><a name="l17010"></a><span class="lineno">17010</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17011"></a><span class="lineno">17011</span>  VkImage image,</div>
-<div class="line"><a name="l17012"></a><span class="lineno">17012</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l17013"></a><span class="lineno">17013</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l17014"></a><span class="lineno">17014</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l17015"></a><span class="lineno">17015</span> {</div>
-<div class="line"><a name="l17016"></a><span class="lineno">17016</span>  VMA_ASSERT(allocator && image != VK_NULL_HANDLE && pCreateInfo && pAllocation);</div>
-<div class="line"><a name="l17017"></a><span class="lineno">17017</span>  </div>
-<div class="line"><a name="l17018"></a><span class="lineno">17018</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryForImage"</span>);</div>
-<div class="line"><a name="l17019"></a><span class="lineno">17019</span>  </div>
-<div class="line"><a name="l17020"></a><span class="lineno">17020</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17021"></a><span class="lineno">17021</span>  </div>
-<div class="line"><a name="l17022"></a><span class="lineno">17022</span>  VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l17023"></a><span class="lineno">17023</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17024"></a><span class="lineno">17024</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17025"></a><span class="lineno">17025</span>  allocator->GetImageMemoryRequirements(image, vkMemReq,</div>
-<div class="line"><a name="l17026"></a><span class="lineno">17026</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17005"></a><span class="lineno">17005</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17006"></a><span class="lineno">17006</span>  </div>
+<div class="line"><a name="l17007"></a><span class="lineno">17007</span>  <span class="keywordflow">if</span>(pAllocationInfo && result == VK_SUCCESS)</div>
+<div class="line"><a name="l17008"></a><span class="lineno">17008</span>  {</div>
+<div class="line"><a name="l17009"></a><span class="lineno">17009</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17010"></a><span class="lineno">17010</span>  }</div>
+<div class="line"><a name="l17011"></a><span class="lineno">17011</span>  </div>
+<div class="line"><a name="l17012"></a><span class="lineno">17012</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l17013"></a><span class="lineno">17013</span> }</div>
+<div class="line"><a name="l17014"></a><span class="lineno">17014</span>  </div>
+<div class="line"><a name="l17015"></a><span class="lineno">17015</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
+<div class="line"><a name="l17016"></a><span class="lineno">17016</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17017"></a><span class="lineno">17017</span>  VkImage image,</div>
+<div class="line"><a name="l17018"></a><span class="lineno">17018</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l17019"></a><span class="lineno">17019</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l17020"></a><span class="lineno">17020</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17021"></a><span class="lineno">17021</span> {</div>
+<div class="line"><a name="l17022"></a><span class="lineno">17022</span>  VMA_ASSERT(allocator && image != VK_NULL_HANDLE && pCreateInfo && pAllocation);</div>
+<div class="line"><a name="l17023"></a><span class="lineno">17023</span>  </div>
+<div class="line"><a name="l17024"></a><span class="lineno">17024</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaAllocateMemoryForImage"</span>);</div>
+<div class="line"><a name="l17025"></a><span class="lineno">17025</span>  </div>
+<div class="line"><a name="l17026"></a><span class="lineno">17026</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
<div class="line"><a name="l17027"></a><span class="lineno">17027</span>  </div>
-<div class="line"><a name="l17028"></a><span class="lineno">17028</span>  VkResult result = allocator->AllocateMemory(</div>
-<div class="line"><a name="l17029"></a><span class="lineno">17029</span>  vkMemReq,</div>
-<div class="line"><a name="l17030"></a><span class="lineno">17030</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l17031"></a><span class="lineno">17031</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l17032"></a><span class="lineno">17032</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l17033"></a><span class="lineno">17033</span>  image, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l17034"></a><span class="lineno">17034</span>  *pCreateInfo,</div>
-<div class="line"><a name="l17035"></a><span class="lineno">17035</span>  VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div>
-<div class="line"><a name="l17036"></a><span class="lineno">17036</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17037"></a><span class="lineno">17037</span>  pAllocation);</div>
-<div class="line"><a name="l17038"></a><span class="lineno">17038</span>  </div>
-<div class="line"><a name="l17039"></a><span class="lineno">17039</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17040"></a><span class="lineno">17040</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17041"></a><span class="lineno">17041</span>  {</div>
-<div class="line"><a name="l17042"></a><span class="lineno">17042</span>  allocator->GetRecorder()->RecordAllocateMemoryForImage(</div>
-<div class="line"><a name="l17043"></a><span class="lineno">17043</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17044"></a><span class="lineno">17044</span>  vkMemReq,</div>
-<div class="line"><a name="l17045"></a><span class="lineno">17045</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l17046"></a><span class="lineno">17046</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l17047"></a><span class="lineno">17047</span>  *pCreateInfo,</div>
-<div class="line"><a name="l17048"></a><span class="lineno">17048</span>  *pAllocation);</div>
-<div class="line"><a name="l17049"></a><span class="lineno">17049</span>  }</div>
-<div class="line"><a name="l17050"></a><span class="lineno">17050</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17051"></a><span class="lineno">17051</span>  </div>
-<div class="line"><a name="l17052"></a><span class="lineno">17052</span>  <span class="keywordflow">if</span>(pAllocationInfo && result == VK_SUCCESS)</div>
-<div class="line"><a name="l17053"></a><span class="lineno">17053</span>  {</div>
-<div class="line"><a name="l17054"></a><span class="lineno">17054</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17028"></a><span class="lineno">17028</span>  VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l17029"></a><span class="lineno">17029</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17030"></a><span class="lineno">17030</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17031"></a><span class="lineno">17031</span>  allocator->GetImageMemoryRequirements(image, vkMemReq,</div>
+<div class="line"><a name="l17032"></a><span class="lineno">17032</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17033"></a><span class="lineno">17033</span>  </div>
+<div class="line"><a name="l17034"></a><span class="lineno">17034</span>  VkResult result = allocator->AllocateMemory(</div>
+<div class="line"><a name="l17035"></a><span class="lineno">17035</span>  vkMemReq,</div>
+<div class="line"><a name="l17036"></a><span class="lineno">17036</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17037"></a><span class="lineno">17037</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17038"></a><span class="lineno">17038</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l17039"></a><span class="lineno">17039</span>  image, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l17040"></a><span class="lineno">17040</span>  *pCreateInfo,</div>
+<div class="line"><a name="l17041"></a><span class="lineno">17041</span>  VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div>
+<div class="line"><a name="l17042"></a><span class="lineno">17042</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17043"></a><span class="lineno">17043</span>  pAllocation);</div>
+<div class="line"><a name="l17044"></a><span class="lineno">17044</span>  </div>
+<div class="line"><a name="l17045"></a><span class="lineno">17045</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17046"></a><span class="lineno">17046</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17047"></a><span class="lineno">17047</span>  {</div>
+<div class="line"><a name="l17048"></a><span class="lineno">17048</span>  allocator->GetRecorder()->RecordAllocateMemoryForImage(</div>
+<div class="line"><a name="l17049"></a><span class="lineno">17049</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17050"></a><span class="lineno">17050</span>  vkMemReq,</div>
+<div class="line"><a name="l17051"></a><span class="lineno">17051</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17052"></a><span class="lineno">17052</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17053"></a><span class="lineno">17053</span>  *pCreateInfo,</div>
+<div class="line"><a name="l17054"></a><span class="lineno">17054</span>  *pAllocation);</div>
<div class="line"><a name="l17055"></a><span class="lineno">17055</span>  }</div>
-<div class="line"><a name="l17056"></a><span class="lineno">17056</span>  </div>
-<div class="line"><a name="l17057"></a><span class="lineno">17057</span>  <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l17058"></a><span class="lineno">17058</span> }</div>
-<div class="line"><a name="l17059"></a><span class="lineno">17059</span>  </div>
-<div class="line"><a name="l17060"></a><span class="lineno">17060</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div>
-<div class="line"><a name="l17061"></a><span class="lineno">17061</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17062"></a><span class="lineno">17062</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17063"></a><span class="lineno">17063</span> {</div>
-<div class="line"><a name="l17064"></a><span class="lineno">17064</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17065"></a><span class="lineno">17065</span>  </div>
-<div class="line"><a name="l17066"></a><span class="lineno">17066</span>  <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17067"></a><span class="lineno">17067</span>  {</div>
-<div class="line"><a name="l17068"></a><span class="lineno">17068</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l17069"></a><span class="lineno">17069</span>  }</div>
-<div class="line"><a name="l17070"></a><span class="lineno">17070</span>  </div>
-<div class="line"><a name="l17071"></a><span class="lineno">17071</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFreeMemory"</span>);</div>
-<div class="line"><a name="l17072"></a><span class="lineno">17072</span>  </div>
-<div class="line"><a name="l17073"></a><span class="lineno">17073</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17074"></a><span class="lineno">17074</span>  </div>
-<div class="line"><a name="l17075"></a><span class="lineno">17075</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17076"></a><span class="lineno">17076</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17077"></a><span class="lineno">17077</span>  {</div>
-<div class="line"><a name="l17078"></a><span class="lineno">17078</span>  allocator->GetRecorder()->RecordFreeMemory(</div>
-<div class="line"><a name="l17079"></a><span class="lineno">17079</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17080"></a><span class="lineno">17080</span>  allocation);</div>
-<div class="line"><a name="l17081"></a><span class="lineno">17081</span>  }</div>
-<div class="line"><a name="l17082"></a><span class="lineno">17082</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17083"></a><span class="lineno">17083</span>  </div>
-<div class="line"><a name="l17084"></a><span class="lineno">17084</span>  allocator->FreeMemory(</div>
-<div class="line"><a name="l17085"></a><span class="lineno">17085</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17086"></a><span class="lineno">17086</span>  &allocation);</div>
-<div class="line"><a name="l17087"></a><span class="lineno">17087</span> }</div>
-<div class="line"><a name="l17088"></a><span class="lineno">17088</span>  </div>
-<div class="line"><a name="l17089"></a><span class="lineno">17089</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</a>(</div>
-<div class="line"><a name="l17090"></a><span class="lineno">17090</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17091"></a><span class="lineno">17091</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l17092"></a><span class="lineno">17092</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l17093"></a><span class="lineno">17093</span> {</div>
-<div class="line"><a name="l17094"></a><span class="lineno">17094</span>  <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l17095"></a><span class="lineno">17095</span>  {</div>
-<div class="line"><a name="l17096"></a><span class="lineno">17096</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l17097"></a><span class="lineno">17097</span>  }</div>
-<div class="line"><a name="l17098"></a><span class="lineno">17098</span>  </div>
-<div class="line"><a name="l17099"></a><span class="lineno">17099</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17100"></a><span class="lineno">17100</span>  </div>
-<div class="line"><a name="l17101"></a><span class="lineno">17101</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFreeMemoryPages"</span>);</div>
-<div class="line"><a name="l17102"></a><span class="lineno">17102</span>  </div>
-<div class="line"><a name="l17103"></a><span class="lineno">17103</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17056"></a><span class="lineno">17056</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17057"></a><span class="lineno">17057</span>  </div>
+<div class="line"><a name="l17058"></a><span class="lineno">17058</span>  <span class="keywordflow">if</span>(pAllocationInfo && result == VK_SUCCESS)</div>
+<div class="line"><a name="l17059"></a><span class="lineno">17059</span>  {</div>
+<div class="line"><a name="l17060"></a><span class="lineno">17060</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17061"></a><span class="lineno">17061</span>  }</div>
+<div class="line"><a name="l17062"></a><span class="lineno">17062</span>  </div>
+<div class="line"><a name="l17063"></a><span class="lineno">17063</span>  <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l17064"></a><span class="lineno">17064</span> }</div>
+<div class="line"><a name="l17065"></a><span class="lineno">17065</span>  </div>
+<div class="line"><a name="l17066"></a><span class="lineno">17066</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div>
+<div class="line"><a name="l17067"></a><span class="lineno">17067</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17068"></a><span class="lineno">17068</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17069"></a><span class="lineno">17069</span> {</div>
+<div class="line"><a name="l17070"></a><span class="lineno">17070</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17071"></a><span class="lineno">17071</span>  </div>
+<div class="line"><a name="l17072"></a><span class="lineno">17072</span>  <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17073"></a><span class="lineno">17073</span>  {</div>
+<div class="line"><a name="l17074"></a><span class="lineno">17074</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17075"></a><span class="lineno">17075</span>  }</div>
+<div class="line"><a name="l17076"></a><span class="lineno">17076</span>  </div>
+<div class="line"><a name="l17077"></a><span class="lineno">17077</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFreeMemory"</span>);</div>
+<div class="line"><a name="l17078"></a><span class="lineno">17078</span>  </div>
+<div class="line"><a name="l17079"></a><span class="lineno">17079</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17080"></a><span class="lineno">17080</span>  </div>
+<div class="line"><a name="l17081"></a><span class="lineno">17081</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17082"></a><span class="lineno">17082</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17083"></a><span class="lineno">17083</span>  {</div>
+<div class="line"><a name="l17084"></a><span class="lineno">17084</span>  allocator->GetRecorder()->RecordFreeMemory(</div>
+<div class="line"><a name="l17085"></a><span class="lineno">17085</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17086"></a><span class="lineno">17086</span>  allocation);</div>
+<div class="line"><a name="l17087"></a><span class="lineno">17087</span>  }</div>
+<div class="line"><a name="l17088"></a><span class="lineno">17088</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17089"></a><span class="lineno">17089</span>  </div>
+<div class="line"><a name="l17090"></a><span class="lineno">17090</span>  allocator->FreeMemory(</div>
+<div class="line"><a name="l17091"></a><span class="lineno">17091</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17092"></a><span class="lineno">17092</span>  &allocation);</div>
+<div class="line"><a name="l17093"></a><span class="lineno">17093</span> }</div>
+<div class="line"><a name="l17094"></a><span class="lineno">17094</span>  </div>
+<div class="line"><a name="l17095"></a><span class="lineno">17095</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab9e709de044c5d8476bea77a4e755840">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l17096"></a><span class="lineno">17096</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17097"></a><span class="lineno">17097</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l17098"></a><span class="lineno">17098</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l17099"></a><span class="lineno">17099</span> {</div>
+<div class="line"><a name="l17100"></a><span class="lineno">17100</span>  <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l17101"></a><span class="lineno">17101</span>  {</div>
+<div class="line"><a name="l17102"></a><span class="lineno">17102</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17103"></a><span class="lineno">17103</span>  }</div>
<div class="line"><a name="l17104"></a><span class="lineno">17104</span>  </div>
-<div class="line"><a name="l17105"></a><span class="lineno">17105</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17106"></a><span class="lineno">17106</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17107"></a><span class="lineno">17107</span>  {</div>
-<div class="line"><a name="l17108"></a><span class="lineno">17108</span>  allocator->GetRecorder()->RecordFreeMemoryPages(</div>
-<div class="line"><a name="l17109"></a><span class="lineno">17109</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17110"></a><span class="lineno">17110</span>  (uint64_t)allocationCount,</div>
-<div class="line"><a name="l17111"></a><span class="lineno">17111</span>  pAllocations);</div>
-<div class="line"><a name="l17112"></a><span class="lineno">17112</span>  }</div>
-<div class="line"><a name="l17113"></a><span class="lineno">17113</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17114"></a><span class="lineno">17114</span>  </div>
-<div class="line"><a name="l17115"></a><span class="lineno">17115</span>  allocator->FreeMemory(allocationCount, pAllocations);</div>
-<div class="line"><a name="l17116"></a><span class="lineno">17116</span> }</div>
-<div class="line"><a name="l17117"></a><span class="lineno">17117</span>  </div>
-<div class="line"><a name="l17118"></a><span class="lineno">17118</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div>
-<div class="line"><a name="l17119"></a><span class="lineno">17119</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17120"></a><span class="lineno">17120</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17121"></a><span class="lineno">17121</span>  VkDeviceSize newSize)</div>
-<div class="line"><a name="l17122"></a><span class="lineno">17122</span> {</div>
-<div class="line"><a name="l17123"></a><span class="lineno">17123</span>  VMA_ASSERT(allocator && allocation);</div>
-<div class="line"><a name="l17124"></a><span class="lineno">17124</span>  </div>
-<div class="line"><a name="l17125"></a><span class="lineno">17125</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaResizeAllocation"</span>);</div>
-<div class="line"><a name="l17126"></a><span class="lineno">17126</span>  </div>
-<div class="line"><a name="l17127"></a><span class="lineno">17127</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17128"></a><span class="lineno">17128</span>  </div>
-<div class="line"><a name="l17129"></a><span class="lineno">17129</span>  <span class="keywordflow">return</span> allocator->ResizeAllocation(allocation, newSize);</div>
-<div class="line"><a name="l17130"></a><span class="lineno">17130</span> }</div>
-<div class="line"><a name="l17131"></a><span class="lineno">17131</span>  </div>
-<div class="line"><a name="l17132"></a><span class="lineno">17132</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
-<div class="line"><a name="l17133"></a><span class="lineno">17133</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17134"></a><span class="lineno">17134</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17135"></a><span class="lineno">17135</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l17136"></a><span class="lineno">17136</span> {</div>
-<div class="line"><a name="l17137"></a><span class="lineno">17137</span>  VMA_ASSERT(allocator && allocation && pAllocationInfo);</div>
-<div class="line"><a name="l17138"></a><span class="lineno">17138</span>  </div>
-<div class="line"><a name="l17139"></a><span class="lineno">17139</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17140"></a><span class="lineno">17140</span>  </div>
-<div class="line"><a name="l17141"></a><span class="lineno">17141</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17142"></a><span class="lineno">17142</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17143"></a><span class="lineno">17143</span>  {</div>
-<div class="line"><a name="l17144"></a><span class="lineno">17144</span>  allocator->GetRecorder()->RecordGetAllocationInfo(</div>
-<div class="line"><a name="l17145"></a><span class="lineno">17145</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17146"></a><span class="lineno">17146</span>  allocation);</div>
-<div class="line"><a name="l17147"></a><span class="lineno">17147</span>  }</div>
-<div class="line"><a name="l17148"></a><span class="lineno">17148</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17149"></a><span class="lineno">17149</span>  </div>
-<div class="line"><a name="l17150"></a><span class="lineno">17150</span>  allocator->GetAllocationInfo(allocation, pAllocationInfo);</div>
-<div class="line"><a name="l17151"></a><span class="lineno">17151</span> }</div>
-<div class="line"><a name="l17152"></a><span class="lineno">17152</span>  </div>
-<div class="line"><a name="l17153"></a><span class="lineno">17153</span> VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
-<div class="line"><a name="l17154"></a><span class="lineno">17154</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17155"></a><span class="lineno">17155</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17156"></a><span class="lineno">17156</span> {</div>
-<div class="line"><a name="l17157"></a><span class="lineno">17157</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17105"></a><span class="lineno">17105</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17106"></a><span class="lineno">17106</span>  </div>
+<div class="line"><a name="l17107"></a><span class="lineno">17107</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFreeMemoryPages"</span>);</div>
+<div class="line"><a name="l17108"></a><span class="lineno">17108</span>  </div>
+<div class="line"><a name="l17109"></a><span class="lineno">17109</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17110"></a><span class="lineno">17110</span>  </div>
+<div class="line"><a name="l17111"></a><span class="lineno">17111</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17112"></a><span class="lineno">17112</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17113"></a><span class="lineno">17113</span>  {</div>
+<div class="line"><a name="l17114"></a><span class="lineno">17114</span>  allocator->GetRecorder()->RecordFreeMemoryPages(</div>
+<div class="line"><a name="l17115"></a><span class="lineno">17115</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17116"></a><span class="lineno">17116</span>  (uint64_t)allocationCount,</div>
+<div class="line"><a name="l17117"></a><span class="lineno">17117</span>  pAllocations);</div>
+<div class="line"><a name="l17118"></a><span class="lineno">17118</span>  }</div>
+<div class="line"><a name="l17119"></a><span class="lineno">17119</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17120"></a><span class="lineno">17120</span>  </div>
+<div class="line"><a name="l17121"></a><span class="lineno">17121</span>  allocator->FreeMemory(allocationCount, pAllocations);</div>
+<div class="line"><a name="l17122"></a><span class="lineno">17122</span> }</div>
+<div class="line"><a name="l17123"></a><span class="lineno">17123</span>  </div>
+<div class="line"><a name="l17124"></a><span class="lineno">17124</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div>
+<div class="line"><a name="l17125"></a><span class="lineno">17125</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17126"></a><span class="lineno">17126</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17127"></a><span class="lineno">17127</span>  VkDeviceSize newSize)</div>
+<div class="line"><a name="l17128"></a><span class="lineno">17128</span> {</div>
+<div class="line"><a name="l17129"></a><span class="lineno">17129</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17130"></a><span class="lineno">17130</span>  </div>
+<div class="line"><a name="l17131"></a><span class="lineno">17131</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaResizeAllocation"</span>);</div>
+<div class="line"><a name="l17132"></a><span class="lineno">17132</span>  </div>
+<div class="line"><a name="l17133"></a><span class="lineno">17133</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17134"></a><span class="lineno">17134</span>  </div>
+<div class="line"><a name="l17135"></a><span class="lineno">17135</span>  <span class="keywordflow">return</span> allocator->ResizeAllocation(allocation, newSize);</div>
+<div class="line"><a name="l17136"></a><span class="lineno">17136</span> }</div>
+<div class="line"><a name="l17137"></a><span class="lineno">17137</span>  </div>
+<div class="line"><a name="l17138"></a><span class="lineno">17138</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
+<div class="line"><a name="l17139"></a><span class="lineno">17139</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17140"></a><span class="lineno">17140</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17141"></a><span class="lineno">17141</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17142"></a><span class="lineno">17142</span> {</div>
+<div class="line"><a name="l17143"></a><span class="lineno">17143</span>  VMA_ASSERT(allocator && allocation && pAllocationInfo);</div>
+<div class="line"><a name="l17144"></a><span class="lineno">17144</span>  </div>
+<div class="line"><a name="l17145"></a><span class="lineno">17145</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17146"></a><span class="lineno">17146</span>  </div>
+<div class="line"><a name="l17147"></a><span class="lineno">17147</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17148"></a><span class="lineno">17148</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17149"></a><span class="lineno">17149</span>  {</div>
+<div class="line"><a name="l17150"></a><span class="lineno">17150</span>  allocator->GetRecorder()->RecordGetAllocationInfo(</div>
+<div class="line"><a name="l17151"></a><span class="lineno">17151</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17152"></a><span class="lineno">17152</span>  allocation);</div>
+<div class="line"><a name="l17153"></a><span class="lineno">17153</span>  }</div>
+<div class="line"><a name="l17154"></a><span class="lineno">17154</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17155"></a><span class="lineno">17155</span>  </div>
+<div class="line"><a name="l17156"></a><span class="lineno">17156</span>  allocator->GetAllocationInfo(allocation, pAllocationInfo);</div>
+<div class="line"><a name="l17157"></a><span class="lineno">17157</span> }</div>
<div class="line"><a name="l17158"></a><span class="lineno">17158</span>  </div>
-<div class="line"><a name="l17159"></a><span class="lineno">17159</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17160"></a><span class="lineno">17160</span>  </div>
-<div class="line"><a name="l17161"></a><span class="lineno">17161</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17162"></a><span class="lineno">17162</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17163"></a><span class="lineno">17163</span>  {</div>
-<div class="line"><a name="l17164"></a><span class="lineno">17164</span>  allocator->GetRecorder()->RecordTouchAllocation(</div>
-<div class="line"><a name="l17165"></a><span class="lineno">17165</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17166"></a><span class="lineno">17166</span>  allocation);</div>
-<div class="line"><a name="l17167"></a><span class="lineno">17167</span>  }</div>
-<div class="line"><a name="l17168"></a><span class="lineno">17168</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17169"></a><span class="lineno">17169</span>  </div>
-<div class="line"><a name="l17170"></a><span class="lineno">17170</span>  <span class="keywordflow">return</span> allocator->TouchAllocation(allocation);</div>
-<div class="line"><a name="l17171"></a><span class="lineno">17171</span> }</div>
-<div class="line"><a name="l17172"></a><span class="lineno">17172</span>  </div>
-<div class="line"><a name="l17173"></a><span class="lineno">17173</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
-<div class="line"><a name="l17174"></a><span class="lineno">17174</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17175"></a><span class="lineno">17175</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17176"></a><span class="lineno">17176</span>  <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l17177"></a><span class="lineno">17177</span> {</div>
-<div class="line"><a name="l17178"></a><span class="lineno">17178</span>  VMA_ASSERT(allocator && allocation);</div>
-<div class="line"><a name="l17179"></a><span class="lineno">17179</span>  </div>
-<div class="line"><a name="l17180"></a><span class="lineno">17180</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17181"></a><span class="lineno">17181</span>  </div>
-<div class="line"><a name="l17182"></a><span class="lineno">17182</span>  allocation->SetUserData(allocator, pUserData);</div>
-<div class="line"><a name="l17183"></a><span class="lineno">17183</span>  </div>
-<div class="line"><a name="l17184"></a><span class="lineno">17184</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17185"></a><span class="lineno">17185</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17186"></a><span class="lineno">17186</span>  {</div>
-<div class="line"><a name="l17187"></a><span class="lineno">17187</span>  allocator->GetRecorder()->RecordSetAllocationUserData(</div>
-<div class="line"><a name="l17188"></a><span class="lineno">17188</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17189"></a><span class="lineno">17189</span>  allocation,</div>
-<div class="line"><a name="l17190"></a><span class="lineno">17190</span>  pUserData);</div>
-<div class="line"><a name="l17191"></a><span class="lineno">17191</span>  }</div>
-<div class="line"><a name="l17192"></a><span class="lineno">17192</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17193"></a><span class="lineno">17193</span> }</div>
-<div class="line"><a name="l17194"></a><span class="lineno">17194</span>  </div>
-<div class="line"><a name="l17195"></a><span class="lineno">17195</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
-<div class="line"><a name="l17196"></a><span class="lineno">17196</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17197"></a><span class="lineno">17197</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l17198"></a><span class="lineno">17198</span> {</div>
-<div class="line"><a name="l17199"></a><span class="lineno">17199</span>  VMA_ASSERT(allocator && pAllocation);</div>
+<div class="line"><a name="l17159"></a><span class="lineno">17159</span> VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
+<div class="line"><a name="l17160"></a><span class="lineno">17160</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17161"></a><span class="lineno">17161</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17162"></a><span class="lineno">17162</span> {</div>
+<div class="line"><a name="l17163"></a><span class="lineno">17163</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17164"></a><span class="lineno">17164</span>  </div>
+<div class="line"><a name="l17165"></a><span class="lineno">17165</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17166"></a><span class="lineno">17166</span>  </div>
+<div class="line"><a name="l17167"></a><span class="lineno">17167</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17168"></a><span class="lineno">17168</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17169"></a><span class="lineno">17169</span>  {</div>
+<div class="line"><a name="l17170"></a><span class="lineno">17170</span>  allocator->GetRecorder()->RecordTouchAllocation(</div>
+<div class="line"><a name="l17171"></a><span class="lineno">17171</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17172"></a><span class="lineno">17172</span>  allocation);</div>
+<div class="line"><a name="l17173"></a><span class="lineno">17173</span>  }</div>
+<div class="line"><a name="l17174"></a><span class="lineno">17174</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17175"></a><span class="lineno">17175</span>  </div>
+<div class="line"><a name="l17176"></a><span class="lineno">17176</span>  <span class="keywordflow">return</span> allocator->TouchAllocation(allocation);</div>
+<div class="line"><a name="l17177"></a><span class="lineno">17177</span> }</div>
+<div class="line"><a name="l17178"></a><span class="lineno">17178</span>  </div>
+<div class="line"><a name="l17179"></a><span class="lineno">17179</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
+<div class="line"><a name="l17180"></a><span class="lineno">17180</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17181"></a><span class="lineno">17181</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17182"></a><span class="lineno">17182</span>  <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l17183"></a><span class="lineno">17183</span> {</div>
+<div class="line"><a name="l17184"></a><span class="lineno">17184</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17185"></a><span class="lineno">17185</span>  </div>
+<div class="line"><a name="l17186"></a><span class="lineno">17186</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17187"></a><span class="lineno">17187</span>  </div>
+<div class="line"><a name="l17188"></a><span class="lineno">17188</span>  allocation->SetUserData(allocator, pUserData);</div>
+<div class="line"><a name="l17189"></a><span class="lineno">17189</span>  </div>
+<div class="line"><a name="l17190"></a><span class="lineno">17190</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17191"></a><span class="lineno">17191</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17192"></a><span class="lineno">17192</span>  {</div>
+<div class="line"><a name="l17193"></a><span class="lineno">17193</span>  allocator->GetRecorder()->RecordSetAllocationUserData(</div>
+<div class="line"><a name="l17194"></a><span class="lineno">17194</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17195"></a><span class="lineno">17195</span>  allocation,</div>
+<div class="line"><a name="l17196"></a><span class="lineno">17196</span>  pUserData);</div>
+<div class="line"><a name="l17197"></a><span class="lineno">17197</span>  }</div>
+<div class="line"><a name="l17198"></a><span class="lineno">17198</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17199"></a><span class="lineno">17199</span> }</div>
<div class="line"><a name="l17200"></a><span class="lineno">17200</span>  </div>
-<div class="line"><a name="l17201"></a><span class="lineno">17201</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div>
-<div class="line"><a name="l17202"></a><span class="lineno">17202</span>  </div>
-<div class="line"><a name="l17203"></a><span class="lineno">17203</span>  allocator->CreateLostAllocation(pAllocation);</div>
-<div class="line"><a name="l17204"></a><span class="lineno">17204</span>  </div>
-<div class="line"><a name="l17205"></a><span class="lineno">17205</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17206"></a><span class="lineno">17206</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17207"></a><span class="lineno">17207</span>  {</div>
-<div class="line"><a name="l17208"></a><span class="lineno">17208</span>  allocator->GetRecorder()->RecordCreateLostAllocation(</div>
-<div class="line"><a name="l17209"></a><span class="lineno">17209</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17210"></a><span class="lineno">17210</span>  *pAllocation);</div>
-<div class="line"><a name="l17211"></a><span class="lineno">17211</span>  }</div>
-<div class="line"><a name="l17212"></a><span class="lineno">17212</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17213"></a><span class="lineno">17213</span> }</div>
-<div class="line"><a name="l17214"></a><span class="lineno">17214</span>  </div>
-<div class="line"><a name="l17215"></a><span class="lineno">17215</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
-<div class="line"><a name="l17216"></a><span class="lineno">17216</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17217"></a><span class="lineno">17217</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17218"></a><span class="lineno">17218</span>  <span class="keywordtype">void</span>** ppData)</div>
-<div class="line"><a name="l17219"></a><span class="lineno">17219</span> {</div>
-<div class="line"><a name="l17220"></a><span class="lineno">17220</span>  VMA_ASSERT(allocator && allocation && ppData);</div>
-<div class="line"><a name="l17221"></a><span class="lineno">17221</span>  </div>
-<div class="line"><a name="l17222"></a><span class="lineno">17222</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17223"></a><span class="lineno">17223</span>  </div>
-<div class="line"><a name="l17224"></a><span class="lineno">17224</span>  VkResult res = allocator->Map(allocation, ppData);</div>
-<div class="line"><a name="l17225"></a><span class="lineno">17225</span>  </div>
-<div class="line"><a name="l17226"></a><span class="lineno">17226</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17227"></a><span class="lineno">17227</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17228"></a><span class="lineno">17228</span>  {</div>
-<div class="line"><a name="l17229"></a><span class="lineno">17229</span>  allocator->GetRecorder()->RecordMapMemory(</div>
-<div class="line"><a name="l17230"></a><span class="lineno">17230</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17231"></a><span class="lineno">17231</span>  allocation);</div>
-<div class="line"><a name="l17232"></a><span class="lineno">17232</span>  }</div>
-<div class="line"><a name="l17233"></a><span class="lineno">17233</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17234"></a><span class="lineno">17234</span>  </div>
-<div class="line"><a name="l17235"></a><span class="lineno">17235</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17236"></a><span class="lineno">17236</span> }</div>
-<div class="line"><a name="l17237"></a><span class="lineno">17237</span>  </div>
-<div class="line"><a name="l17238"></a><span class="lineno">17238</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
-<div class="line"><a name="l17239"></a><span class="lineno">17239</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17240"></a><span class="lineno">17240</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17241"></a><span class="lineno">17241</span> {</div>
-<div class="line"><a name="l17242"></a><span class="lineno">17242</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17201"></a><span class="lineno">17201</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
+<div class="line"><a name="l17202"></a><span class="lineno">17202</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17203"></a><span class="lineno">17203</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l17204"></a><span class="lineno">17204</span> {</div>
+<div class="line"><a name="l17205"></a><span class="lineno">17205</span>  VMA_ASSERT(allocator && pAllocation);</div>
+<div class="line"><a name="l17206"></a><span class="lineno">17206</span>  </div>
+<div class="line"><a name="l17207"></a><span class="lineno">17207</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div>
+<div class="line"><a name="l17208"></a><span class="lineno">17208</span>  </div>
+<div class="line"><a name="l17209"></a><span class="lineno">17209</span>  allocator->CreateLostAllocation(pAllocation);</div>
+<div class="line"><a name="l17210"></a><span class="lineno">17210</span>  </div>
+<div class="line"><a name="l17211"></a><span class="lineno">17211</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17212"></a><span class="lineno">17212</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17213"></a><span class="lineno">17213</span>  {</div>
+<div class="line"><a name="l17214"></a><span class="lineno">17214</span>  allocator->GetRecorder()->RecordCreateLostAllocation(</div>
+<div class="line"><a name="l17215"></a><span class="lineno">17215</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17216"></a><span class="lineno">17216</span>  *pAllocation);</div>
+<div class="line"><a name="l17217"></a><span class="lineno">17217</span>  }</div>
+<div class="line"><a name="l17218"></a><span class="lineno">17218</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17219"></a><span class="lineno">17219</span> }</div>
+<div class="line"><a name="l17220"></a><span class="lineno">17220</span>  </div>
+<div class="line"><a name="l17221"></a><span class="lineno">17221</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
+<div class="line"><a name="l17222"></a><span class="lineno">17222</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17223"></a><span class="lineno">17223</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17224"></a><span class="lineno">17224</span>  <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l17225"></a><span class="lineno">17225</span> {</div>
+<div class="line"><a name="l17226"></a><span class="lineno">17226</span>  VMA_ASSERT(allocator && allocation && ppData);</div>
+<div class="line"><a name="l17227"></a><span class="lineno">17227</span>  </div>
+<div class="line"><a name="l17228"></a><span class="lineno">17228</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17229"></a><span class="lineno">17229</span>  </div>
+<div class="line"><a name="l17230"></a><span class="lineno">17230</span>  VkResult res = allocator->Map(allocation, ppData);</div>
+<div class="line"><a name="l17231"></a><span class="lineno">17231</span>  </div>
+<div class="line"><a name="l17232"></a><span class="lineno">17232</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17233"></a><span class="lineno">17233</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17234"></a><span class="lineno">17234</span>  {</div>
+<div class="line"><a name="l17235"></a><span class="lineno">17235</span>  allocator->GetRecorder()->RecordMapMemory(</div>
+<div class="line"><a name="l17236"></a><span class="lineno">17236</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17237"></a><span class="lineno">17237</span>  allocation);</div>
+<div class="line"><a name="l17238"></a><span class="lineno">17238</span>  }</div>
+<div class="line"><a name="l17239"></a><span class="lineno">17239</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17240"></a><span class="lineno">17240</span>  </div>
+<div class="line"><a name="l17241"></a><span class="lineno">17241</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17242"></a><span class="lineno">17242</span> }</div>
<div class="line"><a name="l17243"></a><span class="lineno">17243</span>  </div>
-<div class="line"><a name="l17244"></a><span class="lineno">17244</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17245"></a><span class="lineno">17245</span>  </div>
-<div class="line"><a name="l17246"></a><span class="lineno">17246</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17247"></a><span class="lineno">17247</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17248"></a><span class="lineno">17248</span>  {</div>
-<div class="line"><a name="l17249"></a><span class="lineno">17249</span>  allocator->GetRecorder()->RecordUnmapMemory(</div>
-<div class="line"><a name="l17250"></a><span class="lineno">17250</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17251"></a><span class="lineno">17251</span>  allocation);</div>
-<div class="line"><a name="l17252"></a><span class="lineno">17252</span>  }</div>
-<div class="line"><a name="l17253"></a><span class="lineno">17253</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17254"></a><span class="lineno">17254</span>  </div>
-<div class="line"><a name="l17255"></a><span class="lineno">17255</span>  allocator->Unmap(allocation);</div>
-<div class="line"><a name="l17256"></a><span class="lineno">17256</span> }</div>
-<div class="line"><a name="l17257"></a><span class="lineno">17257</span>  </div>
-<div class="line"><a name="l17258"></a><span class="lineno">17258</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <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="l17259"></a><span class="lineno">17259</span> {</div>
-<div class="line"><a name="l17260"></a><span class="lineno">17260</span>  VMA_ASSERT(allocator && allocation);</div>
-<div class="line"><a name="l17261"></a><span class="lineno">17261</span>  </div>
-<div class="line"><a name="l17262"></a><span class="lineno">17262</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFlushAllocation"</span>);</div>
+<div class="line"><a name="l17244"></a><span class="lineno">17244</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
+<div class="line"><a name="l17245"></a><span class="lineno">17245</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17246"></a><span class="lineno">17246</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17247"></a><span class="lineno">17247</span> {</div>
+<div class="line"><a name="l17248"></a><span class="lineno">17248</span>  VMA_ASSERT(allocator && allocation);</div>
+<div class="line"><a name="l17249"></a><span class="lineno">17249</span>  </div>
+<div class="line"><a name="l17250"></a><span class="lineno">17250</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17251"></a><span class="lineno">17251</span>  </div>
+<div class="line"><a name="l17252"></a><span class="lineno">17252</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17253"></a><span class="lineno">17253</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17254"></a><span class="lineno">17254</span>  {</div>
+<div class="line"><a name="l17255"></a><span class="lineno">17255</span>  allocator->GetRecorder()->RecordUnmapMemory(</div>
+<div class="line"><a name="l17256"></a><span class="lineno">17256</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17257"></a><span class="lineno">17257</span>  allocation);</div>
+<div class="line"><a name="l17258"></a><span class="lineno">17258</span>  }</div>
+<div class="line"><a name="l17259"></a><span class="lineno">17259</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17260"></a><span class="lineno">17260</span>  </div>
+<div class="line"><a name="l17261"></a><span class="lineno">17261</span>  allocator->Unmap(allocation);</div>
+<div class="line"><a name="l17262"></a><span class="lineno">17262</span> }</div>
<div class="line"><a name="l17263"></a><span class="lineno">17263</span>  </div>
-<div class="line"><a name="l17264"></a><span class="lineno">17264</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17265"></a><span class="lineno">17265</span>  </div>
-<div class="line"><a name="l17266"></a><span class="lineno">17266</span>  allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l17264"></a><span class="lineno">17264</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <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="l17265"></a><span class="lineno">17265</span> {</div>
+<div class="line"><a name="l17266"></a><span class="lineno">17266</span>  VMA_ASSERT(allocator && allocation);</div>
<div class="line"><a name="l17267"></a><span class="lineno">17267</span>  </div>
-<div class="line"><a name="l17268"></a><span class="lineno">17268</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17269"></a><span class="lineno">17269</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17270"></a><span class="lineno">17270</span>  {</div>
-<div class="line"><a name="l17271"></a><span class="lineno">17271</span>  allocator->GetRecorder()->RecordFlushAllocation(</div>
-<div class="line"><a name="l17272"></a><span class="lineno">17272</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17273"></a><span class="lineno">17273</span>  allocation, offset, size);</div>
-<div class="line"><a name="l17274"></a><span class="lineno">17274</span>  }</div>
-<div class="line"><a name="l17275"></a><span class="lineno">17275</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17276"></a><span class="lineno">17276</span> }</div>
-<div class="line"><a name="l17277"></a><span class="lineno">17277</span>  </div>
-<div class="line"><a name="l17278"></a><span class="lineno">17278</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <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="l17279"></a><span class="lineno">17279</span> {</div>
-<div class="line"><a name="l17280"></a><span class="lineno">17280</span>  VMA_ASSERT(allocator && allocation);</div>
-<div class="line"><a name="l17281"></a><span class="lineno">17281</span>  </div>
-<div class="line"><a name="l17282"></a><span class="lineno">17282</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaInvalidateAllocation"</span>);</div>
+<div class="line"><a name="l17268"></a><span class="lineno">17268</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaFlushAllocation"</span>);</div>
+<div class="line"><a name="l17269"></a><span class="lineno">17269</span>  </div>
+<div class="line"><a name="l17270"></a><span class="lineno">17270</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17271"></a><span class="lineno">17271</span>  </div>
+<div class="line"><a name="l17272"></a><span class="lineno">17272</span>  allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l17273"></a><span class="lineno">17273</span>  </div>
+<div class="line"><a name="l17274"></a><span class="lineno">17274</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17275"></a><span class="lineno">17275</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17276"></a><span class="lineno">17276</span>  {</div>
+<div class="line"><a name="l17277"></a><span class="lineno">17277</span>  allocator->GetRecorder()->RecordFlushAllocation(</div>
+<div class="line"><a name="l17278"></a><span class="lineno">17278</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17279"></a><span class="lineno">17279</span>  allocation, offset, size);</div>
+<div class="line"><a name="l17280"></a><span class="lineno">17280</span>  }</div>
+<div class="line"><a name="l17281"></a><span class="lineno">17281</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17282"></a><span class="lineno">17282</span> }</div>
<div class="line"><a name="l17283"></a><span class="lineno">17283</span>  </div>
-<div class="line"><a name="l17284"></a><span class="lineno">17284</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17285"></a><span class="lineno">17285</span>  </div>
-<div class="line"><a name="l17286"></a><span class="lineno">17286</span>  allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l17284"></a><span class="lineno">17284</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <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="l17285"></a><span class="lineno">17285</span> {</div>
+<div class="line"><a name="l17286"></a><span class="lineno">17286</span>  VMA_ASSERT(allocator && allocation);</div>
<div class="line"><a name="l17287"></a><span class="lineno">17287</span>  </div>
-<div class="line"><a name="l17288"></a><span class="lineno">17288</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17289"></a><span class="lineno">17289</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17290"></a><span class="lineno">17290</span>  {</div>
-<div class="line"><a name="l17291"></a><span class="lineno">17291</span>  allocator->GetRecorder()->RecordInvalidateAllocation(</div>
-<div class="line"><a name="l17292"></a><span class="lineno">17292</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17293"></a><span class="lineno">17293</span>  allocation, offset, size);</div>
-<div class="line"><a name="l17294"></a><span class="lineno">17294</span>  }</div>
-<div class="line"><a name="l17295"></a><span class="lineno">17295</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17296"></a><span class="lineno">17296</span> }</div>
-<div class="line"><a name="l17297"></a><span class="lineno">17297</span>  </div>
-<div class="line"><a name="l17298"></a><span class="lineno">17298</span> VMA_CALL_PRE VkResult VMA_CALL_POST <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="l17299"></a><span class="lineno">17299</span> {</div>
-<div class="line"><a name="l17300"></a><span class="lineno">17300</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17301"></a><span class="lineno">17301</span>  </div>
-<div class="line"><a name="l17302"></a><span class="lineno">17302</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCheckCorruption"</span>);</div>
+<div class="line"><a name="l17288"></a><span class="lineno">17288</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaInvalidateAllocation"</span>);</div>
+<div class="line"><a name="l17289"></a><span class="lineno">17289</span>  </div>
+<div class="line"><a name="l17290"></a><span class="lineno">17290</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17291"></a><span class="lineno">17291</span>  </div>
+<div class="line"><a name="l17292"></a><span class="lineno">17292</span>  allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l17293"></a><span class="lineno">17293</span>  </div>
+<div class="line"><a name="l17294"></a><span class="lineno">17294</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17295"></a><span class="lineno">17295</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17296"></a><span class="lineno">17296</span>  {</div>
+<div class="line"><a name="l17297"></a><span class="lineno">17297</span>  allocator->GetRecorder()->RecordInvalidateAllocation(</div>
+<div class="line"><a name="l17298"></a><span class="lineno">17298</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17299"></a><span class="lineno">17299</span>  allocation, offset, size);</div>
+<div class="line"><a name="l17300"></a><span class="lineno">17300</span>  }</div>
+<div class="line"><a name="l17301"></a><span class="lineno">17301</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17302"></a><span class="lineno">17302</span> }</div>
<div class="line"><a name="l17303"></a><span class="lineno">17303</span>  </div>
-<div class="line"><a name="l17304"></a><span class="lineno">17304</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17305"></a><span class="lineno">17305</span>  </div>
-<div class="line"><a name="l17306"></a><span class="lineno">17306</span>  <span class="keywordflow">return</span> allocator->CheckCorruption(memoryTypeBits);</div>
-<div class="line"><a name="l17307"></a><span class="lineno">17307</span> }</div>
-<div class="line"><a name="l17308"></a><span class="lineno">17308</span>  </div>
-<div class="line"><a name="l17309"></a><span class="lineno">17309</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div>
-<div class="line"><a name="l17310"></a><span class="lineno">17310</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17311"></a><span class="lineno">17311</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l17312"></a><span class="lineno">17312</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l17313"></a><span class="lineno">17313</span>  VkBool32* pAllocationsChanged,</div>
-<div class="line"><a name="l17314"></a><span class="lineno">17314</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div>
-<div class="line"><a name="l17315"></a><span class="lineno">17315</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
-<div class="line"><a name="l17316"></a><span class="lineno">17316</span> {</div>
-<div class="line"><a name="l17317"></a><span class="lineno">17317</span>  <span class="comment">// Deprecated interface, reimplemented using new one.</span></div>
-<div class="line"><a name="l17318"></a><span class="lineno">17318</span>  </div>
-<div class="line"><a name="l17319"></a><span class="lineno">17319</span>  <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div>
-<div class="line"><a name="l17320"></a><span class="lineno">17320</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div>
-<div class="line"><a name="l17321"></a><span class="lineno">17321</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = pAllocations;</div>
-<div class="line"><a name="l17322"></a><span class="lineno">17322</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div>
-<div class="line"><a name="l17323"></a><span class="lineno">17323</span>  <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div>
-<div class="line"><a name="l17324"></a><span class="lineno">17324</span>  {</div>
-<div class="line"><a name="l17325"></a><span class="lineno">17325</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = pDefragmentationInfo-><a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
-<div class="line"><a name="l17326"></a><span class="lineno">17326</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = pDefragmentationInfo-><a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
-<div class="line"><a name="l17327"></a><span class="lineno">17327</span>  }</div>
-<div class="line"><a name="l17328"></a><span class="lineno">17328</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17329"></a><span class="lineno">17329</span>  {</div>
-<div class="line"><a name="l17330"></a><span class="lineno">17330</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div>
-<div class="line"><a name="l17331"></a><span class="lineno">17331</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l17332"></a><span class="lineno">17332</span>  }</div>
-<div class="line"><a name="l17333"></a><span class="lineno">17333</span>  <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div>
-<div class="line"><a name="l17334"></a><span class="lineno">17334</span>  </div>
-<div class="line"><a name="l17335"></a><span class="lineno">17335</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div>
-<div class="line"><a name="l17336"></a><span class="lineno">17336</span>  VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &info2, pDefragmentationStats, &ctx);</div>
-<div class="line"><a name="l17337"></a><span class="lineno">17337</span>  <span class="keywordflow">if</span>(res == VK_NOT_READY)</div>
-<div class="line"><a name="l17338"></a><span class="lineno">17338</span>  {</div>
-<div class="line"><a name="l17339"></a><span class="lineno">17339</span>  res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div>
-<div class="line"><a name="l17340"></a><span class="lineno">17340</span>  }</div>
-<div class="line"><a name="l17341"></a><span class="lineno">17341</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17342"></a><span class="lineno">17342</span> }</div>
-<div class="line"><a name="l17343"></a><span class="lineno">17343</span>  </div>
-<div class="line"><a name="l17344"></a><span class="lineno">17344</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
-<div class="line"><a name="l17345"></a><span class="lineno">17345</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17346"></a><span class="lineno">17346</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div>
-<div class="line"><a name="l17347"></a><span class="lineno">17347</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l17348"></a><span class="lineno">17348</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div>
-<div class="line"><a name="l17349"></a><span class="lineno">17349</span> {</div>
-<div class="line"><a name="l17350"></a><span class="lineno">17350</span>  VMA_ASSERT(allocator && pInfo && pContext);</div>
-<div class="line"><a name="l17351"></a><span class="lineno">17351</span>  </div>
-<div class="line"><a name="l17352"></a><span class="lineno">17352</span>  <span class="comment">// Degenerate case: Nothing to defragment.</span></div>
-<div class="line"><a name="l17353"></a><span class="lineno">17353</span>  <span class="keywordflow">if</span>(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 && pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div>
-<div class="line"><a name="l17354"></a><span class="lineno">17354</span>  {</div>
-<div class="line"><a name="l17355"></a><span class="lineno">17355</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l17356"></a><span class="lineno">17356</span>  }</div>
+<div class="line"><a name="l17304"></a><span class="lineno">17304</span> VMA_CALL_PRE VkResult VMA_CALL_POST <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="l17305"></a><span class="lineno">17305</span> {</div>
+<div class="line"><a name="l17306"></a><span class="lineno">17306</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17307"></a><span class="lineno">17307</span>  </div>
+<div class="line"><a name="l17308"></a><span class="lineno">17308</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCheckCorruption"</span>);</div>
+<div class="line"><a name="l17309"></a><span class="lineno">17309</span>  </div>
+<div class="line"><a name="l17310"></a><span class="lineno">17310</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17311"></a><span class="lineno">17311</span>  </div>
+<div class="line"><a name="l17312"></a><span class="lineno">17312</span>  <span class="keywordflow">return</span> allocator->CheckCorruption(memoryTypeBits);</div>
+<div class="line"><a name="l17313"></a><span class="lineno">17313</span> }</div>
+<div class="line"><a name="l17314"></a><span class="lineno">17314</span>  </div>
+<div class="line"><a name="l17315"></a><span class="lineno">17315</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div>
+<div class="line"><a name="l17316"></a><span class="lineno">17316</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17317"></a><span class="lineno">17317</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l17318"></a><span class="lineno">17318</span>  <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l17319"></a><span class="lineno">17319</span>  VkBool32* pAllocationsChanged,</div>
+<div class="line"><a name="l17320"></a><span class="lineno">17320</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div>
+<div class="line"><a name="l17321"></a><span class="lineno">17321</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
+<div class="line"><a name="l17322"></a><span class="lineno">17322</span> {</div>
+<div class="line"><a name="l17323"></a><span class="lineno">17323</span>  <span class="comment">// Deprecated interface, reimplemented using new one.</span></div>
+<div class="line"><a name="l17324"></a><span class="lineno">17324</span>  </div>
+<div class="line"><a name="l17325"></a><span class="lineno">17325</span>  <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div>
+<div class="line"><a name="l17326"></a><span class="lineno">17326</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div>
+<div class="line"><a name="l17327"></a><span class="lineno">17327</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = pAllocations;</div>
+<div class="line"><a name="l17328"></a><span class="lineno">17328</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div>
+<div class="line"><a name="l17329"></a><span class="lineno">17329</span>  <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17330"></a><span class="lineno">17330</span>  {</div>
+<div class="line"><a name="l17331"></a><span class="lineno">17331</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = pDefragmentationInfo-><a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
+<div class="line"><a name="l17332"></a><span class="lineno">17332</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = pDefragmentationInfo-><a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
+<div class="line"><a name="l17333"></a><span class="lineno">17333</span>  }</div>
+<div class="line"><a name="l17334"></a><span class="lineno">17334</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17335"></a><span class="lineno">17335</span>  {</div>
+<div class="line"><a name="l17336"></a><span class="lineno">17336</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div>
+<div class="line"><a name="l17337"></a><span class="lineno">17337</span>  info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l17338"></a><span class="lineno">17338</span>  }</div>
+<div class="line"><a name="l17339"></a><span class="lineno">17339</span>  <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div>
+<div class="line"><a name="l17340"></a><span class="lineno">17340</span>  </div>
+<div class="line"><a name="l17341"></a><span class="lineno">17341</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div>
+<div class="line"><a name="l17342"></a><span class="lineno">17342</span>  VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &info2, pDefragmentationStats, &ctx);</div>
+<div class="line"><a name="l17343"></a><span class="lineno">17343</span>  <span class="keywordflow">if</span>(res == VK_NOT_READY)</div>
+<div class="line"><a name="l17344"></a><span class="lineno">17344</span>  {</div>
+<div class="line"><a name="l17345"></a><span class="lineno">17345</span>  res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div>
+<div class="line"><a name="l17346"></a><span class="lineno">17346</span>  }</div>
+<div class="line"><a name="l17347"></a><span class="lineno">17347</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17348"></a><span class="lineno">17348</span> }</div>
+<div class="line"><a name="l17349"></a><span class="lineno">17349</span>  </div>
+<div class="line"><a name="l17350"></a><span class="lineno">17350</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
+<div class="line"><a name="l17351"></a><span class="lineno">17351</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17352"></a><span class="lineno">17352</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div>
+<div class="line"><a name="l17353"></a><span class="lineno">17353</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l17354"></a><span class="lineno">17354</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div>
+<div class="line"><a name="l17355"></a><span class="lineno">17355</span> {</div>
+<div class="line"><a name="l17356"></a><span class="lineno">17356</span>  VMA_ASSERT(allocator && pInfo && pContext);</div>
<div class="line"><a name="l17357"></a><span class="lineno">17357</span>  </div>
-<div class="line"><a name="l17358"></a><span class="lineno">17358</span>  VMA_ASSERT(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> != VMA_NULL);</div>
-<div class="line"><a name="l17359"></a><span class="lineno">17359</span>  VMA_ASSERT(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a> != VMA_NULL);</div>
-<div class="line"><a name="l17360"></a><span class="lineno">17360</span>  VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>));</div>
-<div class="line"><a name="l17361"></a><span class="lineno">17361</span>  VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>));</div>
-<div class="line"><a name="l17362"></a><span class="lineno">17362</span>  </div>
-<div class="line"><a name="l17363"></a><span class="lineno">17363</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDefragmentationBegin"</span>);</div>
-<div class="line"><a name="l17364"></a><span class="lineno">17364</span>  </div>
-<div class="line"><a name="l17365"></a><span class="lineno">17365</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17366"></a><span class="lineno">17366</span>  </div>
-<div class="line"><a name="l17367"></a><span class="lineno">17367</span>  VkResult res = allocator->DefragmentationBegin(*pInfo, pStats, pContext);</div>
+<div class="line"><a name="l17358"></a><span class="lineno">17358</span>  <span class="comment">// Degenerate case: Nothing to defragment.</span></div>
+<div class="line"><a name="l17359"></a><span class="lineno">17359</span>  <span class="keywordflow">if</span>(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 && pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div>
+<div class="line"><a name="l17360"></a><span class="lineno">17360</span>  {</div>
+<div class="line"><a name="l17361"></a><span class="lineno">17361</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17362"></a><span class="lineno">17362</span>  }</div>
+<div class="line"><a name="l17363"></a><span class="lineno">17363</span>  </div>
+<div class="line"><a name="l17364"></a><span class="lineno">17364</span>  VMA_ASSERT(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> != VMA_NULL);</div>
+<div class="line"><a name="l17365"></a><span class="lineno">17365</span>  VMA_ASSERT(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a> != VMA_NULL);</div>
+<div class="line"><a name="l17366"></a><span class="lineno">17366</span>  VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>));</div>
+<div class="line"><a name="l17367"></a><span class="lineno">17367</span>  VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-><a class="code" href="struct_vma_defragmentation_info2.html#a0b3effd57f3fcdeb2ed62210b4ef20e1">pPools</a>));</div>
<div class="line"><a name="l17368"></a><span class="lineno">17368</span>  </div>
-<div class="line"><a name="l17369"></a><span class="lineno">17369</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17370"></a><span class="lineno">17370</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17371"></a><span class="lineno">17371</span>  {</div>
-<div class="line"><a name="l17372"></a><span class="lineno">17372</span>  allocator->GetRecorder()->RecordDefragmentationBegin(</div>
-<div class="line"><a name="l17373"></a><span class="lineno">17373</span>  allocator->GetCurrentFrameIndex(), *pInfo, *pContext);</div>
-<div class="line"><a name="l17374"></a><span class="lineno">17374</span>  }</div>
-<div class="line"><a name="l17375"></a><span class="lineno">17375</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17376"></a><span class="lineno">17376</span>  </div>
-<div class="line"><a name="l17377"></a><span class="lineno">17377</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17378"></a><span class="lineno">17378</span> }</div>
-<div class="line"><a name="l17379"></a><span class="lineno">17379</span>  </div>
-<div class="line"><a name="l17380"></a><span class="lineno">17380</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
-<div class="line"><a name="l17381"></a><span class="lineno">17381</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17382"></a><span class="lineno">17382</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l17383"></a><span class="lineno">17383</span> {</div>
-<div class="line"><a name="l17384"></a><span class="lineno">17384</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17369"></a><span class="lineno">17369</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDefragmentationBegin"</span>);</div>
+<div class="line"><a name="l17370"></a><span class="lineno">17370</span>  </div>
+<div class="line"><a name="l17371"></a><span class="lineno">17371</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17372"></a><span class="lineno">17372</span>  </div>
+<div class="line"><a name="l17373"></a><span class="lineno">17373</span>  VkResult res = allocator->DefragmentationBegin(*pInfo, pStats, pContext);</div>
+<div class="line"><a name="l17374"></a><span class="lineno">17374</span>  </div>
+<div class="line"><a name="l17375"></a><span class="lineno">17375</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17376"></a><span class="lineno">17376</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17377"></a><span class="lineno">17377</span>  {</div>
+<div class="line"><a name="l17378"></a><span class="lineno">17378</span>  allocator->GetRecorder()->RecordDefragmentationBegin(</div>
+<div class="line"><a name="l17379"></a><span class="lineno">17379</span>  allocator->GetCurrentFrameIndex(), *pInfo, *pContext);</div>
+<div class="line"><a name="l17380"></a><span class="lineno">17380</span>  }</div>
+<div class="line"><a name="l17381"></a><span class="lineno">17381</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17382"></a><span class="lineno">17382</span>  </div>
+<div class="line"><a name="l17383"></a><span class="lineno">17383</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17384"></a><span class="lineno">17384</span> }</div>
<div class="line"><a name="l17385"></a><span class="lineno">17385</span>  </div>
-<div class="line"><a name="l17386"></a><span class="lineno">17386</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDefragmentationEnd"</span>);</div>
-<div class="line"><a name="l17387"></a><span class="lineno">17387</span>  </div>
-<div class="line"><a name="l17388"></a><span class="lineno">17388</span>  <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17389"></a><span class="lineno">17389</span>  {</div>
-<div class="line"><a name="l17390"></a><span class="lineno">17390</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17386"></a><span class="lineno">17386</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
+<div class="line"><a name="l17387"></a><span class="lineno">17387</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17388"></a><span class="lineno">17388</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l17389"></a><span class="lineno">17389</span> {</div>
+<div class="line"><a name="l17390"></a><span class="lineno">17390</span>  VMA_ASSERT(allocator);</div>
<div class="line"><a name="l17391"></a><span class="lineno">17391</span>  </div>
-<div class="line"><a name="l17392"></a><span class="lineno">17392</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17393"></a><span class="lineno">17393</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17394"></a><span class="lineno">17394</span>  {</div>
-<div class="line"><a name="l17395"></a><span class="lineno">17395</span>  allocator->GetRecorder()->RecordDefragmentationEnd(</div>
-<div class="line"><a name="l17396"></a><span class="lineno">17396</span>  allocator->GetCurrentFrameIndex(), context);</div>
-<div class="line"><a name="l17397"></a><span class="lineno">17397</span>  }</div>
-<div class="line"><a name="l17398"></a><span class="lineno">17398</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17399"></a><span class="lineno">17399</span>  </div>
-<div class="line"><a name="l17400"></a><span class="lineno">17400</span>  <span class="keywordflow">return</span> allocator->DefragmentationEnd(context);</div>
-<div class="line"><a name="l17401"></a><span class="lineno">17401</span>  }</div>
-<div class="line"><a name="l17402"></a><span class="lineno">17402</span>  <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17403"></a><span class="lineno">17403</span>  {</div>
-<div class="line"><a name="l17404"></a><span class="lineno">17404</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l17405"></a><span class="lineno">17405</span>  }</div>
-<div class="line"><a name="l17406"></a><span class="lineno">17406</span> }</div>
-<div class="line"><a name="l17407"></a><span class="lineno">17407</span>  </div>
-<div class="line"><a name="l17408"></a><span class="lineno">17408</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
-<div class="line"><a name="l17409"></a><span class="lineno">17409</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17410"></a><span class="lineno">17410</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17411"></a><span class="lineno">17411</span>  VkBuffer buffer)</div>
-<div class="line"><a name="l17412"></a><span class="lineno">17412</span> {</div>
-<div class="line"><a name="l17413"></a><span class="lineno">17413</span>  VMA_ASSERT(allocator && allocation && buffer);</div>
-<div class="line"><a name="l17414"></a><span class="lineno">17414</span>  </div>
-<div class="line"><a name="l17415"></a><span class="lineno">17415</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindBufferMemory"</span>);</div>
-<div class="line"><a name="l17416"></a><span class="lineno">17416</span>  </div>
-<div class="line"><a name="l17417"></a><span class="lineno">17417</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17418"></a><span class="lineno">17418</span>  </div>
-<div class="line"><a name="l17419"></a><span class="lineno">17419</span>  <span class="keywordflow">return</span> allocator->BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div>
-<div class="line"><a name="l17420"></a><span class="lineno">17420</span> }</div>
-<div class="line"><a name="l17421"></a><span class="lineno">17421</span>  </div>
-<div class="line"><a name="l17422"></a><span class="lineno">17422</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
-<div class="line"><a name="l17423"></a><span class="lineno">17423</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17424"></a><span class="lineno">17424</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17425"></a><span class="lineno">17425</span>  VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l17426"></a><span class="lineno">17426</span>  VkBuffer buffer,</div>
-<div class="line"><a name="l17427"></a><span class="lineno">17427</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l17428"></a><span class="lineno">17428</span> {</div>
-<div class="line"><a name="l17429"></a><span class="lineno">17429</span>  VMA_ASSERT(allocator && allocation && buffer);</div>
-<div class="line"><a name="l17430"></a><span class="lineno">17430</span>  </div>
-<div class="line"><a name="l17431"></a><span class="lineno">17431</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindBufferMemory2"</span>);</div>
-<div class="line"><a name="l17432"></a><span class="lineno">17432</span>  </div>
-<div class="line"><a name="l17433"></a><span class="lineno">17433</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17434"></a><span class="lineno">17434</span>  </div>
-<div class="line"><a name="l17435"></a><span class="lineno">17435</span>  <span class="keywordflow">return</span> allocator->BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div>
-<div class="line"><a name="l17436"></a><span class="lineno">17436</span> }</div>
-<div class="line"><a name="l17437"></a><span class="lineno">17437</span>  </div>
-<div class="line"><a name="l17438"></a><span class="lineno">17438</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
-<div class="line"><a name="l17439"></a><span class="lineno">17439</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17440"></a><span class="lineno">17440</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17441"></a><span class="lineno">17441</span>  VkImage image)</div>
-<div class="line"><a name="l17442"></a><span class="lineno">17442</span> {</div>
-<div class="line"><a name="l17443"></a><span class="lineno">17443</span>  VMA_ASSERT(allocator && allocation && image);</div>
-<div class="line"><a name="l17444"></a><span class="lineno">17444</span>  </div>
-<div class="line"><a name="l17445"></a><span class="lineno">17445</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindImageMemory"</span>);</div>
-<div class="line"><a name="l17446"></a><span class="lineno">17446</span>  </div>
-<div class="line"><a name="l17447"></a><span class="lineno">17447</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17448"></a><span class="lineno">17448</span>  </div>
-<div class="line"><a name="l17449"></a><span class="lineno">17449</span>  <span class="keywordflow">return</span> allocator->BindImageMemory(allocation, 0, image, VMA_NULL);</div>
-<div class="line"><a name="l17450"></a><span class="lineno">17450</span> }</div>
-<div class="line"><a name="l17451"></a><span class="lineno">17451</span>  </div>
-<div class="line"><a name="l17452"></a><span class="lineno">17452</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
-<div class="line"><a name="l17453"></a><span class="lineno">17453</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17454"></a><span class="lineno">17454</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17455"></a><span class="lineno">17455</span>  VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l17456"></a><span class="lineno">17456</span>  VkImage image,</div>
-<div class="line"><a name="l17457"></a><span class="lineno">17457</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l17458"></a><span class="lineno">17458</span> {</div>
-<div class="line"><a name="l17459"></a><span class="lineno">17459</span>  VMA_ASSERT(allocator && allocation && image);</div>
-<div class="line"><a name="l17460"></a><span class="lineno">17460</span>  </div>
-<div class="line"><a name="l17461"></a><span class="lineno">17461</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindImageMemory2"</span>);</div>
-<div class="line"><a name="l17462"></a><span class="lineno">17462</span>  </div>
-<div class="line"><a name="l17463"></a><span class="lineno">17463</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17464"></a><span class="lineno">17464</span>  </div>
-<div class="line"><a name="l17465"></a><span class="lineno">17465</span>  <span class="keywordflow">return</span> allocator->BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div>
-<div class="line"><a name="l17466"></a><span class="lineno">17466</span> }</div>
-<div class="line"><a name="l17467"></a><span class="lineno">17467</span>  </div>
-<div class="line"><a name="l17468"></a><span class="lineno">17468</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
-<div class="line"><a name="l17469"></a><span class="lineno">17469</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17470"></a><span class="lineno">17470</span>  <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
-<div class="line"><a name="l17471"></a><span class="lineno">17471</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l17472"></a><span class="lineno">17472</span>  VkBuffer* pBuffer,</div>
-<div class="line"><a name="l17473"></a><span class="lineno">17473</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l17474"></a><span class="lineno">17474</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l17475"></a><span class="lineno">17475</span> {</div>
-<div class="line"><a name="l17476"></a><span class="lineno">17476</span>  VMA_ASSERT(allocator && pBufferCreateInfo && pAllocationCreateInfo && pBuffer && pAllocation);</div>
-<div class="line"><a name="l17477"></a><span class="lineno">17477</span>  </div>
-<div class="line"><a name="l17478"></a><span class="lineno">17478</span>  <span class="keywordflow">if</span>(pBufferCreateInfo->size == 0)</div>
-<div class="line"><a name="l17479"></a><span class="lineno">17479</span>  {</div>
-<div class="line"><a name="l17480"></a><span class="lineno">17480</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l17481"></a><span class="lineno">17481</span>  }</div>
-<div class="line"><a name="l17482"></a><span class="lineno">17482</span>  </div>
-<div class="line"><a name="l17483"></a><span class="lineno">17483</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateBuffer"</span>);</div>
-<div class="line"><a name="l17484"></a><span class="lineno">17484</span>  </div>
-<div class="line"><a name="l17485"></a><span class="lineno">17485</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17486"></a><span class="lineno">17486</span>  </div>
-<div class="line"><a name="l17487"></a><span class="lineno">17487</span>  *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17488"></a><span class="lineno">17488</span>  *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17489"></a><span class="lineno">17489</span>  </div>
-<div class="line"><a name="l17490"></a><span class="lineno">17490</span>  <span class="comment">// 1. Create VkBuffer.</span></div>
-<div class="line"><a name="l17491"></a><span class="lineno">17491</span>  VkResult res = (*allocator->GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l17492"></a><span class="lineno">17492</span>  allocator->m_hDevice,</div>
-<div class="line"><a name="l17493"></a><span class="lineno">17493</span>  pBufferCreateInfo,</div>
-<div class="line"><a name="l17494"></a><span class="lineno">17494</span>  allocator->GetAllocationCallbacks(),</div>
-<div class="line"><a name="l17495"></a><span class="lineno">17495</span>  pBuffer);</div>
-<div class="line"><a name="l17496"></a><span class="lineno">17496</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17497"></a><span class="lineno">17497</span>  {</div>
-<div class="line"><a name="l17498"></a><span class="lineno">17498</span>  <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div>
-<div class="line"><a name="l17499"></a><span class="lineno">17499</span>  VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l17500"></a><span class="lineno">17500</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17501"></a><span class="lineno">17501</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17502"></a><span class="lineno">17502</span>  allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div>
-<div class="line"><a name="l17503"></a><span class="lineno">17503</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
-<div class="line"><a name="l17504"></a><span class="lineno">17504</span>  </div>
-<div class="line"><a name="l17505"></a><span class="lineno">17505</span>  <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div>
-<div class="line"><a name="l17506"></a><span class="lineno">17506</span>  <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div>
-<div class="line"><a name="l17507"></a><span class="lineno">17507</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div>
-<div class="line"><a name="l17508"></a><span class="lineno">17508</span>  {</div>
-<div class="line"><a name="l17509"></a><span class="lineno">17509</span>  VMA_ASSERT(vkMemReq.alignment %</div>
-<div class="line"><a name="l17510"></a><span class="lineno">17510</span>  allocator->m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div>
-<div class="line"><a name="l17511"></a><span class="lineno">17511</span>  }</div>
-<div class="line"><a name="l17512"></a><span class="lineno">17512</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div>
-<div class="line"><a name="l17513"></a><span class="lineno">17513</span>  {</div>
-<div class="line"><a name="l17514"></a><span class="lineno">17514</span>  VMA_ASSERT(vkMemReq.alignment %</div>
-<div class="line"><a name="l17515"></a><span class="lineno">17515</span>  allocator->m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div>
-<div class="line"><a name="l17516"></a><span class="lineno">17516</span>  }</div>
-<div class="line"><a name="l17517"></a><span class="lineno">17517</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div>
-<div class="line"><a name="l17518"></a><span class="lineno">17518</span>  {</div>
-<div class="line"><a name="l17519"></a><span class="lineno">17519</span>  VMA_ASSERT(vkMemReq.alignment %</div>
-<div class="line"><a name="l17520"></a><span class="lineno">17520</span>  allocator->m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div>
-<div class="line"><a name="l17521"></a><span class="lineno">17521</span>  }</div>
-<div class="line"><a name="l17522"></a><span class="lineno">17522</span>  </div>
-<div class="line"><a name="l17523"></a><span class="lineno">17523</span>  <span class="comment">// 3. Allocate memory using allocator.</span></div>
-<div class="line"><a name="l17524"></a><span class="lineno">17524</span>  res = allocator->AllocateMemory(</div>
-<div class="line"><a name="l17525"></a><span class="lineno">17525</span>  vkMemReq,</div>
-<div class="line"><a name="l17526"></a><span class="lineno">17526</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l17527"></a><span class="lineno">17527</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l17528"></a><span class="lineno">17528</span>  *pBuffer, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l17529"></a><span class="lineno">17529</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l17530"></a><span class="lineno">17530</span>  *pAllocationCreateInfo,</div>
-<div class="line"><a name="l17531"></a><span class="lineno">17531</span>  VMA_SUBALLOCATION_TYPE_BUFFER,</div>
-<div class="line"><a name="l17532"></a><span class="lineno">17532</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17533"></a><span class="lineno">17533</span>  pAllocation);</div>
-<div class="line"><a name="l17534"></a><span class="lineno">17534</span>  </div>
-<div class="line"><a name="l17535"></a><span class="lineno">17535</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17536"></a><span class="lineno">17536</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17537"></a><span class="lineno">17537</span>  {</div>
-<div class="line"><a name="l17538"></a><span class="lineno">17538</span>  allocator->GetRecorder()->RecordCreateBuffer(</div>
-<div class="line"><a name="l17539"></a><span class="lineno">17539</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17540"></a><span class="lineno">17540</span>  *pBufferCreateInfo,</div>
-<div class="line"><a name="l17541"></a><span class="lineno">17541</span>  *pAllocationCreateInfo,</div>
-<div class="line"><a name="l17542"></a><span class="lineno">17542</span>  *pAllocation);</div>
-<div class="line"><a name="l17543"></a><span class="lineno">17543</span>  }</div>
-<div class="line"><a name="l17544"></a><span class="lineno">17544</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17545"></a><span class="lineno">17545</span>  </div>
-<div class="line"><a name="l17546"></a><span class="lineno">17546</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17547"></a><span class="lineno">17547</span>  {</div>
-<div class="line"><a name="l17548"></a><span class="lineno">17548</span>  <span class="comment">// 3. Bind buffer with memory.</span></div>
-<div class="line"><a name="l17549"></a><span class="lineno">17549</span>  <span class="keywordflow">if</span>((pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
-<div class="line"><a name="l17550"></a><span class="lineno">17550</span>  {</div>
-<div class="line"><a name="l17551"></a><span class="lineno">17551</span>  res = allocator->BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div>
-<div class="line"><a name="l17552"></a><span class="lineno">17552</span>  }</div>
-<div class="line"><a name="l17553"></a><span class="lineno">17553</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17554"></a><span class="lineno">17554</span>  {</div>
-<div class="line"><a name="l17555"></a><span class="lineno">17555</span>  <span class="comment">// All steps succeeded.</span></div>
-<div class="line"><a name="l17556"></a><span class="lineno">17556</span> <span class="preprocessor"> #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l17557"></a><span class="lineno">17557</span>  (*pAllocation)->InitBufferImageUsage(pBufferCreateInfo->usage);</div>
-<div class="line"><a name="l17558"></a><span class="lineno">17558</span> <span class="preprocessor"> #endif</span></div>
-<div class="line"><a name="l17559"></a><span class="lineno">17559</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
-<div class="line"><a name="l17560"></a><span class="lineno">17560</span>  {</div>
-<div class="line"><a name="l17561"></a><span class="lineno">17561</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l17562"></a><span class="lineno">17562</span>  }</div>
-<div class="line"><a name="l17563"></a><span class="lineno">17563</span>  </div>
-<div class="line"><a name="l17564"></a><span class="lineno">17564</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l17565"></a><span class="lineno">17565</span>  }</div>
-<div class="line"><a name="l17566"></a><span class="lineno">17566</span>  allocator->FreeMemory(</div>
-<div class="line"><a name="l17567"></a><span class="lineno">17567</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17568"></a><span class="lineno">17568</span>  pAllocation);</div>
-<div class="line"><a name="l17569"></a><span class="lineno">17569</span>  *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17570"></a><span class="lineno">17570</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l17571"></a><span class="lineno">17571</span>  *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17572"></a><span class="lineno">17572</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17573"></a><span class="lineno">17573</span>  }</div>
-<div class="line"><a name="l17574"></a><span class="lineno">17574</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l17575"></a><span class="lineno">17575</span>  *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17576"></a><span class="lineno">17576</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17577"></a><span class="lineno">17577</span>  }</div>
-<div class="line"><a name="l17578"></a><span class="lineno">17578</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17579"></a><span class="lineno">17579</span> }</div>
-<div class="line"><a name="l17580"></a><span class="lineno">17580</span>  </div>
-<div class="line"><a name="l17581"></a><span class="lineno">17581</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
-<div class="line"><a name="l17582"></a><span class="lineno">17582</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17583"></a><span class="lineno">17583</span>  VkBuffer buffer,</div>
-<div class="line"><a name="l17584"></a><span class="lineno">17584</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17585"></a><span class="lineno">17585</span> {</div>
-<div class="line"><a name="l17586"></a><span class="lineno">17586</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17587"></a><span class="lineno">17587</span>  </div>
-<div class="line"><a name="l17588"></a><span class="lineno">17588</span>  <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17589"></a><span class="lineno">17589</span>  {</div>
-<div class="line"><a name="l17590"></a><span class="lineno">17590</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l17591"></a><span class="lineno">17591</span>  }</div>
-<div class="line"><a name="l17592"></a><span class="lineno">17592</span>  </div>
-<div class="line"><a name="l17593"></a><span class="lineno">17593</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyBuffer"</span>);</div>
-<div class="line"><a name="l17594"></a><span class="lineno">17594</span>  </div>
-<div class="line"><a name="l17595"></a><span class="lineno">17595</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17596"></a><span class="lineno">17596</span>  </div>
-<div class="line"><a name="l17597"></a><span class="lineno">17597</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17598"></a><span class="lineno">17598</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17599"></a><span class="lineno">17599</span>  {</div>
-<div class="line"><a name="l17600"></a><span class="lineno">17600</span>  allocator->GetRecorder()->RecordDestroyBuffer(</div>
-<div class="line"><a name="l17601"></a><span class="lineno">17601</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17602"></a><span class="lineno">17602</span>  allocation);</div>
-<div class="line"><a name="l17603"></a><span class="lineno">17603</span>  }</div>
-<div class="line"><a name="l17604"></a><span class="lineno">17604</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17605"></a><span class="lineno">17605</span>  </div>
-<div class="line"><a name="l17606"></a><span class="lineno">17606</span>  <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17607"></a><span class="lineno">17607</span>  {</div>
-<div class="line"><a name="l17608"></a><span class="lineno">17608</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, buffer, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17392"></a><span class="lineno">17392</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDefragmentationEnd"</span>);</div>
+<div class="line"><a name="l17393"></a><span class="lineno">17393</span>  </div>
+<div class="line"><a name="l17394"></a><span class="lineno">17394</span>  <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17395"></a><span class="lineno">17395</span>  {</div>
+<div class="line"><a name="l17396"></a><span class="lineno">17396</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17397"></a><span class="lineno">17397</span>  </div>
+<div class="line"><a name="l17398"></a><span class="lineno">17398</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17399"></a><span class="lineno">17399</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17400"></a><span class="lineno">17400</span>  {</div>
+<div class="line"><a name="l17401"></a><span class="lineno">17401</span>  allocator->GetRecorder()->RecordDefragmentationEnd(</div>
+<div class="line"><a name="l17402"></a><span class="lineno">17402</span>  allocator->GetCurrentFrameIndex(), context);</div>
+<div class="line"><a name="l17403"></a><span class="lineno">17403</span>  }</div>
+<div class="line"><a name="l17404"></a><span class="lineno">17404</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17405"></a><span class="lineno">17405</span>  </div>
+<div class="line"><a name="l17406"></a><span class="lineno">17406</span>  <span class="keywordflow">return</span> allocator->DefragmentationEnd(context);</div>
+<div class="line"><a name="l17407"></a><span class="lineno">17407</span>  }</div>
+<div class="line"><a name="l17408"></a><span class="lineno">17408</span>  <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17409"></a><span class="lineno">17409</span>  {</div>
+<div class="line"><a name="l17410"></a><span class="lineno">17410</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17411"></a><span class="lineno">17411</span>  }</div>
+<div class="line"><a name="l17412"></a><span class="lineno">17412</span> }</div>
+<div class="line"><a name="l17413"></a><span class="lineno">17413</span>  </div>
+<div class="line"><a name="l17414"></a><span class="lineno">17414</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
+<div class="line"><a name="l17415"></a><span class="lineno">17415</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17416"></a><span class="lineno">17416</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17417"></a><span class="lineno">17417</span>  VkBuffer buffer)</div>
+<div class="line"><a name="l17418"></a><span class="lineno">17418</span> {</div>
+<div class="line"><a name="l17419"></a><span class="lineno">17419</span>  VMA_ASSERT(allocator && allocation && buffer);</div>
+<div class="line"><a name="l17420"></a><span class="lineno">17420</span>  </div>
+<div class="line"><a name="l17421"></a><span class="lineno">17421</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindBufferMemory"</span>);</div>
+<div class="line"><a name="l17422"></a><span class="lineno">17422</span>  </div>
+<div class="line"><a name="l17423"></a><span class="lineno">17423</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17424"></a><span class="lineno">17424</span>  </div>
+<div class="line"><a name="l17425"></a><span class="lineno">17425</span>  <span class="keywordflow">return</span> allocator->BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div>
+<div class="line"><a name="l17426"></a><span class="lineno">17426</span> }</div>
+<div class="line"><a name="l17427"></a><span class="lineno">17427</span>  </div>
+<div class="line"><a name="l17428"></a><span class="lineno">17428</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
+<div class="line"><a name="l17429"></a><span class="lineno">17429</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17430"></a><span class="lineno">17430</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17431"></a><span class="lineno">17431</span>  VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17432"></a><span class="lineno">17432</span>  VkBuffer buffer,</div>
+<div class="line"><a name="l17433"></a><span class="lineno">17433</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17434"></a><span class="lineno">17434</span> {</div>
+<div class="line"><a name="l17435"></a><span class="lineno">17435</span>  VMA_ASSERT(allocator && allocation && buffer);</div>
+<div class="line"><a name="l17436"></a><span class="lineno">17436</span>  </div>
+<div class="line"><a name="l17437"></a><span class="lineno">17437</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindBufferMemory2"</span>);</div>
+<div class="line"><a name="l17438"></a><span class="lineno">17438</span>  </div>
+<div class="line"><a name="l17439"></a><span class="lineno">17439</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17440"></a><span class="lineno">17440</span>  </div>
+<div class="line"><a name="l17441"></a><span class="lineno">17441</span>  <span class="keywordflow">return</span> allocator->BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div>
+<div class="line"><a name="l17442"></a><span class="lineno">17442</span> }</div>
+<div class="line"><a name="l17443"></a><span class="lineno">17443</span>  </div>
+<div class="line"><a name="l17444"></a><span class="lineno">17444</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
+<div class="line"><a name="l17445"></a><span class="lineno">17445</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17446"></a><span class="lineno">17446</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17447"></a><span class="lineno">17447</span>  VkImage image)</div>
+<div class="line"><a name="l17448"></a><span class="lineno">17448</span> {</div>
+<div class="line"><a name="l17449"></a><span class="lineno">17449</span>  VMA_ASSERT(allocator && allocation && image);</div>
+<div class="line"><a name="l17450"></a><span class="lineno">17450</span>  </div>
+<div class="line"><a name="l17451"></a><span class="lineno">17451</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindImageMemory"</span>);</div>
+<div class="line"><a name="l17452"></a><span class="lineno">17452</span>  </div>
+<div class="line"><a name="l17453"></a><span class="lineno">17453</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17454"></a><span class="lineno">17454</span>  </div>
+<div class="line"><a name="l17455"></a><span class="lineno">17455</span>  <span class="keywordflow">return</span> allocator->BindImageMemory(allocation, 0, image, VMA_NULL);</div>
+<div class="line"><a name="l17456"></a><span class="lineno">17456</span> }</div>
+<div class="line"><a name="l17457"></a><span class="lineno">17457</span>  </div>
+<div class="line"><a name="l17458"></a><span class="lineno">17458</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
+<div class="line"><a name="l17459"></a><span class="lineno">17459</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17460"></a><span class="lineno">17460</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17461"></a><span class="lineno">17461</span>  VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17462"></a><span class="lineno">17462</span>  VkImage image,</div>
+<div class="line"><a name="l17463"></a><span class="lineno">17463</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17464"></a><span class="lineno">17464</span> {</div>
+<div class="line"><a name="l17465"></a><span class="lineno">17465</span>  VMA_ASSERT(allocator && allocation && image);</div>
+<div class="line"><a name="l17466"></a><span class="lineno">17466</span>  </div>
+<div class="line"><a name="l17467"></a><span class="lineno">17467</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaBindImageMemory2"</span>);</div>
+<div class="line"><a name="l17468"></a><span class="lineno">17468</span>  </div>
+<div class="line"><a name="l17469"></a><span class="lineno">17469</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17470"></a><span class="lineno">17470</span>  </div>
+<div class="line"><a name="l17471"></a><span class="lineno">17471</span>  <span class="keywordflow">return</span> allocator->BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div>
+<div class="line"><a name="l17472"></a><span class="lineno">17472</span> }</div>
+<div class="line"><a name="l17473"></a><span class="lineno">17473</span>  </div>
+<div class="line"><a name="l17474"></a><span class="lineno">17474</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l17475"></a><span class="lineno">17475</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17476"></a><span class="lineno">17476</span>  <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l17477"></a><span class="lineno">17477</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l17478"></a><span class="lineno">17478</span>  VkBuffer* pBuffer,</div>
+<div class="line"><a name="l17479"></a><span class="lineno">17479</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l17480"></a><span class="lineno">17480</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17481"></a><span class="lineno">17481</span> {</div>
+<div class="line"><a name="l17482"></a><span class="lineno">17482</span>  VMA_ASSERT(allocator && pBufferCreateInfo && pAllocationCreateInfo && pBuffer && pAllocation);</div>
+<div class="line"><a name="l17483"></a><span class="lineno">17483</span>  </div>
+<div class="line"><a name="l17484"></a><span class="lineno">17484</span>  <span class="keywordflow">if</span>(pBufferCreateInfo->size == 0)</div>
+<div class="line"><a name="l17485"></a><span class="lineno">17485</span>  {</div>
+<div class="line"><a name="l17486"></a><span class="lineno">17486</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l17487"></a><span class="lineno">17487</span>  }</div>
+<div class="line"><a name="l17488"></a><span class="lineno">17488</span>  </div>
+<div class="line"><a name="l17489"></a><span class="lineno">17489</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateBuffer"</span>);</div>
+<div class="line"><a name="l17490"></a><span class="lineno">17490</span>  </div>
+<div class="line"><a name="l17491"></a><span class="lineno">17491</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17492"></a><span class="lineno">17492</span>  </div>
+<div class="line"><a name="l17493"></a><span class="lineno">17493</span>  *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17494"></a><span class="lineno">17494</span>  *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17495"></a><span class="lineno">17495</span>  </div>
+<div class="line"><a name="l17496"></a><span class="lineno">17496</span>  <span class="comment">// 1. Create VkBuffer.</span></div>
+<div class="line"><a name="l17497"></a><span class="lineno">17497</span>  VkResult res = (*allocator->GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l17498"></a><span class="lineno">17498</span>  allocator->m_hDevice,</div>
+<div class="line"><a name="l17499"></a><span class="lineno">17499</span>  pBufferCreateInfo,</div>
+<div class="line"><a name="l17500"></a><span class="lineno">17500</span>  allocator->GetAllocationCallbacks(),</div>
+<div class="line"><a name="l17501"></a><span class="lineno">17501</span>  pBuffer);</div>
+<div class="line"><a name="l17502"></a><span class="lineno">17502</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17503"></a><span class="lineno">17503</span>  {</div>
+<div class="line"><a name="l17504"></a><span class="lineno">17504</span>  <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div>
+<div class="line"><a name="l17505"></a><span class="lineno">17505</span>  VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l17506"></a><span class="lineno">17506</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17507"></a><span class="lineno">17507</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17508"></a><span class="lineno">17508</span>  allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div>
+<div class="line"><a name="l17509"></a><span class="lineno">17509</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17510"></a><span class="lineno">17510</span>  </div>
+<div class="line"><a name="l17511"></a><span class="lineno">17511</span>  <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div>
+<div class="line"><a name="l17512"></a><span class="lineno">17512</span>  <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div>
+<div class="line"><a name="l17513"></a><span class="lineno">17513</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div>
+<div class="line"><a name="l17514"></a><span class="lineno">17514</span>  {</div>
+<div class="line"><a name="l17515"></a><span class="lineno">17515</span>  VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17516"></a><span class="lineno">17516</span>  allocator->m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17517"></a><span class="lineno">17517</span>  }</div>
+<div class="line"><a name="l17518"></a><span class="lineno">17518</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div>
+<div class="line"><a name="l17519"></a><span class="lineno">17519</span>  {</div>
+<div class="line"><a name="l17520"></a><span class="lineno">17520</span>  VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17521"></a><span class="lineno">17521</span>  allocator->m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17522"></a><span class="lineno">17522</span>  }</div>
+<div class="line"><a name="l17523"></a><span class="lineno">17523</span>  <span class="keywordflow">if</span>((pBufferCreateInfo->usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div>
+<div class="line"><a name="l17524"></a><span class="lineno">17524</span>  {</div>
+<div class="line"><a name="l17525"></a><span class="lineno">17525</span>  VMA_ASSERT(vkMemReq.alignment %</div>
+<div class="line"><a name="l17526"></a><span class="lineno">17526</span>  allocator->m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div>
+<div class="line"><a name="l17527"></a><span class="lineno">17527</span>  }</div>
+<div class="line"><a name="l17528"></a><span class="lineno">17528</span>  </div>
+<div class="line"><a name="l17529"></a><span class="lineno">17529</span>  <span class="comment">// 3. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l17530"></a><span class="lineno">17530</span>  res = allocator->AllocateMemory(</div>
+<div class="line"><a name="l17531"></a><span class="lineno">17531</span>  vkMemReq,</div>
+<div class="line"><a name="l17532"></a><span class="lineno">17532</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17533"></a><span class="lineno">17533</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17534"></a><span class="lineno">17534</span>  *pBuffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l17535"></a><span class="lineno">17535</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l17536"></a><span class="lineno">17536</span>  *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17537"></a><span class="lineno">17537</span>  VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l17538"></a><span class="lineno">17538</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17539"></a><span class="lineno">17539</span>  pAllocation);</div>
+<div class="line"><a name="l17540"></a><span class="lineno">17540</span>  </div>
+<div class="line"><a name="l17541"></a><span class="lineno">17541</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17542"></a><span class="lineno">17542</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17543"></a><span class="lineno">17543</span>  {</div>
+<div class="line"><a name="l17544"></a><span class="lineno">17544</span>  allocator->GetRecorder()->RecordCreateBuffer(</div>
+<div class="line"><a name="l17545"></a><span class="lineno">17545</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17546"></a><span class="lineno">17546</span>  *pBufferCreateInfo,</div>
+<div class="line"><a name="l17547"></a><span class="lineno">17547</span>  *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17548"></a><span class="lineno">17548</span>  *pAllocation);</div>
+<div class="line"><a name="l17549"></a><span class="lineno">17549</span>  }</div>
+<div class="line"><a name="l17550"></a><span class="lineno">17550</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17551"></a><span class="lineno">17551</span>  </div>
+<div class="line"><a name="l17552"></a><span class="lineno">17552</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17553"></a><span class="lineno">17553</span>  {</div>
+<div class="line"><a name="l17554"></a><span class="lineno">17554</span>  <span class="comment">// 3. Bind buffer with memory.</span></div>
+<div class="line"><a name="l17555"></a><span class="lineno">17555</span>  <span class="keywordflow">if</span>((pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l17556"></a><span class="lineno">17556</span>  {</div>
+<div class="line"><a name="l17557"></a><span class="lineno">17557</span>  res = allocator->BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div>
+<div class="line"><a name="l17558"></a><span class="lineno">17558</span>  }</div>
+<div class="line"><a name="l17559"></a><span class="lineno">17559</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17560"></a><span class="lineno">17560</span>  {</div>
+<div class="line"><a name="l17561"></a><span class="lineno">17561</span>  <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l17562"></a><span class="lineno">17562</span> <span class="preprocessor"> #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17563"></a><span class="lineno">17563</span>  (*pAllocation)->InitBufferImageUsage(pBufferCreateInfo->usage);</div>
+<div class="line"><a name="l17564"></a><span class="lineno">17564</span> <span class="preprocessor"> #endif</span></div>
+<div class="line"><a name="l17565"></a><span class="lineno">17565</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17566"></a><span class="lineno">17566</span>  {</div>
+<div class="line"><a name="l17567"></a><span class="lineno">17567</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17568"></a><span class="lineno">17568</span>  }</div>
+<div class="line"><a name="l17569"></a><span class="lineno">17569</span>  </div>
+<div class="line"><a name="l17570"></a><span class="lineno">17570</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17571"></a><span class="lineno">17571</span>  }</div>
+<div class="line"><a name="l17572"></a><span class="lineno">17572</span>  allocator->FreeMemory(</div>
+<div class="line"><a name="l17573"></a><span class="lineno">17573</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17574"></a><span class="lineno">17574</span>  pAllocation);</div>
+<div class="line"><a name="l17575"></a><span class="lineno">17575</span>  *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17576"></a><span class="lineno">17576</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17577"></a><span class="lineno">17577</span>  *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17578"></a><span class="lineno">17578</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17579"></a><span class="lineno">17579</span>  }</div>
+<div class="line"><a name="l17580"></a><span class="lineno">17580</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, *pBuffer, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17581"></a><span class="lineno">17581</span>  *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17582"></a><span class="lineno">17582</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17583"></a><span class="lineno">17583</span>  }</div>
+<div class="line"><a name="l17584"></a><span class="lineno">17584</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17585"></a><span class="lineno">17585</span> }</div>
+<div class="line"><a name="l17586"></a><span class="lineno">17586</span>  </div>
+<div class="line"><a name="l17587"></a><span class="lineno">17587</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
+<div class="line"><a name="l17588"></a><span class="lineno">17588</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17589"></a><span class="lineno">17589</span>  VkBuffer buffer,</div>
+<div class="line"><a name="l17590"></a><span class="lineno">17590</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17591"></a><span class="lineno">17591</span> {</div>
+<div class="line"><a name="l17592"></a><span class="lineno">17592</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17593"></a><span class="lineno">17593</span>  </div>
+<div class="line"><a name="l17594"></a><span class="lineno">17594</span>  <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17595"></a><span class="lineno">17595</span>  {</div>
+<div class="line"><a name="l17596"></a><span class="lineno">17596</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17597"></a><span class="lineno">17597</span>  }</div>
+<div class="line"><a name="l17598"></a><span class="lineno">17598</span>  </div>
+<div class="line"><a name="l17599"></a><span class="lineno">17599</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyBuffer"</span>);</div>
+<div class="line"><a name="l17600"></a><span class="lineno">17600</span>  </div>
+<div class="line"><a name="l17601"></a><span class="lineno">17601</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17602"></a><span class="lineno">17602</span>  </div>
+<div class="line"><a name="l17603"></a><span class="lineno">17603</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17604"></a><span class="lineno">17604</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17605"></a><span class="lineno">17605</span>  {</div>
+<div class="line"><a name="l17606"></a><span class="lineno">17606</span>  allocator->GetRecorder()->RecordDestroyBuffer(</div>
+<div class="line"><a name="l17607"></a><span class="lineno">17607</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17608"></a><span class="lineno">17608</span>  allocation);</div>
<div class="line"><a name="l17609"></a><span class="lineno">17609</span>  }</div>
-<div class="line"><a name="l17610"></a><span class="lineno">17610</span>  </div>
-<div class="line"><a name="l17611"></a><span class="lineno">17611</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17612"></a><span class="lineno">17612</span>  {</div>
-<div class="line"><a name="l17613"></a><span class="lineno">17613</span>  allocator->FreeMemory(</div>
-<div class="line"><a name="l17614"></a><span class="lineno">17614</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17615"></a><span class="lineno">17615</span>  &allocation);</div>
-<div class="line"><a name="l17616"></a><span class="lineno">17616</span>  }</div>
-<div class="line"><a name="l17617"></a><span class="lineno">17617</span> }</div>
-<div class="line"><a name="l17618"></a><span class="lineno">17618</span>  </div>
-<div class="line"><a name="l17619"></a><span class="lineno">17619</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
-<div class="line"><a name="l17620"></a><span class="lineno">17620</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17621"></a><span class="lineno">17621</span>  <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
-<div class="line"><a name="l17622"></a><span class="lineno">17622</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l17623"></a><span class="lineno">17623</span>  VkImage* pImage,</div>
-<div class="line"><a name="l17624"></a><span class="lineno">17624</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l17625"></a><span class="lineno">17625</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l17626"></a><span class="lineno">17626</span> {</div>
-<div class="line"><a name="l17627"></a><span class="lineno">17627</span>  VMA_ASSERT(allocator && pImageCreateInfo && pAllocationCreateInfo && pImage && pAllocation);</div>
-<div class="line"><a name="l17628"></a><span class="lineno">17628</span>  </div>
-<div class="line"><a name="l17629"></a><span class="lineno">17629</span>  <span class="keywordflow">if</span>(pImageCreateInfo->extent.width == 0 ||</div>
-<div class="line"><a name="l17630"></a><span class="lineno">17630</span>  pImageCreateInfo->extent.height == 0 ||</div>
-<div class="line"><a name="l17631"></a><span class="lineno">17631</span>  pImageCreateInfo->extent.depth == 0 ||</div>
-<div class="line"><a name="l17632"></a><span class="lineno">17632</span>  pImageCreateInfo->mipLevels == 0 ||</div>
-<div class="line"><a name="l17633"></a><span class="lineno">17633</span>  pImageCreateInfo->arrayLayers == 0)</div>
-<div class="line"><a name="l17634"></a><span class="lineno">17634</span>  {</div>
-<div class="line"><a name="l17635"></a><span class="lineno">17635</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l17636"></a><span class="lineno">17636</span>  }</div>
-<div class="line"><a name="l17637"></a><span class="lineno">17637</span>  </div>
-<div class="line"><a name="l17638"></a><span class="lineno">17638</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateImage"</span>);</div>
-<div class="line"><a name="l17639"></a><span class="lineno">17639</span>  </div>
-<div class="line"><a name="l17640"></a><span class="lineno">17640</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17641"></a><span class="lineno">17641</span>  </div>
-<div class="line"><a name="l17642"></a><span class="lineno">17642</span>  *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17643"></a><span class="lineno">17643</span>  *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17644"></a><span class="lineno">17644</span>  </div>
-<div class="line"><a name="l17645"></a><span class="lineno">17645</span>  <span class="comment">// 1. Create VkImage.</span></div>
-<div class="line"><a name="l17646"></a><span class="lineno">17646</span>  VkResult res = (*allocator->GetVulkanFunctions().vkCreateImage)(</div>
-<div class="line"><a name="l17647"></a><span class="lineno">17647</span>  allocator->m_hDevice,</div>
-<div class="line"><a name="l17648"></a><span class="lineno">17648</span>  pImageCreateInfo,</div>
-<div class="line"><a name="l17649"></a><span class="lineno">17649</span>  allocator->GetAllocationCallbacks(),</div>
-<div class="line"><a name="l17650"></a><span class="lineno">17650</span>  pImage);</div>
-<div class="line"><a name="l17651"></a><span class="lineno">17651</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17652"></a><span class="lineno">17652</span>  {</div>
-<div class="line"><a name="l17653"></a><span class="lineno">17653</span>  VmaSuballocationType suballocType = pImageCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL ?</div>
-<div class="line"><a name="l17654"></a><span class="lineno">17654</span>  VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div>
-<div class="line"><a name="l17655"></a><span class="lineno">17655</span>  VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div>
-<div class="line"><a name="l17656"></a><span class="lineno">17656</span>  </div>
-<div class="line"><a name="l17657"></a><span class="lineno">17657</span>  <span class="comment">// 2. Allocate memory using allocator.</span></div>
-<div class="line"><a name="l17658"></a><span class="lineno">17658</span>  VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l17659"></a><span class="lineno">17659</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17660"></a><span class="lineno">17660</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17661"></a><span class="lineno">17661</span>  allocator->GetImageMemoryRequirements(*pImage, vkMemReq,</div>
-<div class="line"><a name="l17662"></a><span class="lineno">17662</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
-<div class="line"><a name="l17663"></a><span class="lineno">17663</span>  </div>
-<div class="line"><a name="l17664"></a><span class="lineno">17664</span>  res = allocator->AllocateMemory(</div>
-<div class="line"><a name="l17665"></a><span class="lineno">17665</span>  vkMemReq,</div>
-<div class="line"><a name="l17666"></a><span class="lineno">17666</span>  requiresDedicatedAllocation,</div>
-<div class="line"><a name="l17667"></a><span class="lineno">17667</span>  prefersDedicatedAllocation,</div>
-<div class="line"><a name="l17668"></a><span class="lineno">17668</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l17669"></a><span class="lineno">17669</span>  *pImage, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l17670"></a><span class="lineno">17670</span>  *pAllocationCreateInfo,</div>
-<div class="line"><a name="l17671"></a><span class="lineno">17671</span>  suballocType,</div>
-<div class="line"><a name="l17672"></a><span class="lineno">17672</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17673"></a><span class="lineno">17673</span>  pAllocation);</div>
-<div class="line"><a name="l17674"></a><span class="lineno">17674</span>  </div>
-<div class="line"><a name="l17675"></a><span class="lineno">17675</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17676"></a><span class="lineno">17676</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17677"></a><span class="lineno">17677</span>  {</div>
-<div class="line"><a name="l17678"></a><span class="lineno">17678</span>  allocator->GetRecorder()->RecordCreateImage(</div>
-<div class="line"><a name="l17679"></a><span class="lineno">17679</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17680"></a><span class="lineno">17680</span>  *pImageCreateInfo,</div>
-<div class="line"><a name="l17681"></a><span class="lineno">17681</span>  *pAllocationCreateInfo,</div>
-<div class="line"><a name="l17682"></a><span class="lineno">17682</span>  *pAllocation);</div>
-<div class="line"><a name="l17683"></a><span class="lineno">17683</span>  }</div>
-<div class="line"><a name="l17684"></a><span class="lineno">17684</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17685"></a><span class="lineno">17685</span>  </div>
-<div class="line"><a name="l17686"></a><span class="lineno">17686</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17687"></a><span class="lineno">17687</span>  {</div>
-<div class="line"><a name="l17688"></a><span class="lineno">17688</span>  <span class="comment">// 3. Bind image with memory.</span></div>
-<div class="line"><a name="l17689"></a><span class="lineno">17689</span>  <span class="keywordflow">if</span>((pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
-<div class="line"><a name="l17690"></a><span class="lineno">17690</span>  {</div>
-<div class="line"><a name="l17691"></a><span class="lineno">17691</span>  res = allocator->BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div>
-<div class="line"><a name="l17692"></a><span class="lineno">17692</span>  }</div>
-<div class="line"><a name="l17693"></a><span class="lineno">17693</span>  <span class="keywordflow">if</span>(res >= 0)</div>
-<div class="line"><a name="l17694"></a><span class="lineno">17694</span>  {</div>
-<div class="line"><a name="l17695"></a><span class="lineno">17695</span>  <span class="comment">// All steps succeeded.</span></div>
-<div class="line"><a name="l17696"></a><span class="lineno">17696</span> <span class="preprocessor"> #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l17697"></a><span class="lineno">17697</span>  (*pAllocation)->InitBufferImageUsage(pImageCreateInfo->usage);</div>
-<div class="line"><a name="l17698"></a><span class="lineno">17698</span> <span class="preprocessor"> #endif</span></div>
-<div class="line"><a name="l17699"></a><span class="lineno">17699</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
-<div class="line"><a name="l17700"></a><span class="lineno">17700</span>  {</div>
-<div class="line"><a name="l17701"></a><span class="lineno">17701</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l17702"></a><span class="lineno">17702</span>  }</div>
-<div class="line"><a name="l17703"></a><span class="lineno">17703</span>  </div>
-<div class="line"><a name="l17704"></a><span class="lineno">17704</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l17705"></a><span class="lineno">17705</span>  }</div>
-<div class="line"><a name="l17706"></a><span class="lineno">17706</span>  allocator->FreeMemory(</div>
-<div class="line"><a name="l17707"></a><span class="lineno">17707</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17708"></a><span class="lineno">17708</span>  pAllocation);</div>
-<div class="line"><a name="l17709"></a><span class="lineno">17709</span>  *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17710"></a><span class="lineno">17710</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l17711"></a><span class="lineno">17711</span>  *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17712"></a><span class="lineno">17712</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17713"></a><span class="lineno">17713</span>  }</div>
-<div class="line"><a name="l17714"></a><span class="lineno">17714</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());</div>
-<div class="line"><a name="l17715"></a><span class="lineno">17715</span>  *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17716"></a><span class="lineno">17716</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17717"></a><span class="lineno">17717</span>  }</div>
-<div class="line"><a name="l17718"></a><span class="lineno">17718</span>  <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17719"></a><span class="lineno">17719</span> }</div>
-<div class="line"><a name="l17720"></a><span class="lineno">17720</span>  </div>
-<div class="line"><a name="l17721"></a><span class="lineno">17721</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
-<div class="line"><a name="l17722"></a><span class="lineno">17722</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17723"></a><span class="lineno">17723</span>  VkImage image,</div>
-<div class="line"><a name="l17724"></a><span class="lineno">17724</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17725"></a><span class="lineno">17725</span> {</div>
-<div class="line"><a name="l17726"></a><span class="lineno">17726</span>  VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17727"></a><span class="lineno">17727</span>  </div>
-<div class="line"><a name="l17728"></a><span class="lineno">17728</span>  <span class="keywordflow">if</span>(image == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17729"></a><span class="lineno">17729</span>  {</div>
-<div class="line"><a name="l17730"></a><span class="lineno">17730</span>  <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l17731"></a><span class="lineno">17731</span>  }</div>
-<div class="line"><a name="l17732"></a><span class="lineno">17732</span>  </div>
-<div class="line"><a name="l17733"></a><span class="lineno">17733</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyImage"</span>);</div>
-<div class="line"><a name="l17734"></a><span class="lineno">17734</span>  </div>
-<div class="line"><a name="l17735"></a><span class="lineno">17735</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17736"></a><span class="lineno">17736</span>  </div>
-<div class="line"><a name="l17737"></a><span class="lineno">17737</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17738"></a><span class="lineno">17738</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17739"></a><span class="lineno">17739</span>  {</div>
-<div class="line"><a name="l17740"></a><span class="lineno">17740</span>  allocator->GetRecorder()->RecordDestroyImage(</div>
-<div class="line"><a name="l17741"></a><span class="lineno">17741</span>  allocator->GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l17742"></a><span class="lineno">17742</span>  allocation);</div>
-<div class="line"><a name="l17743"></a><span class="lineno">17743</span>  }</div>
-<div class="line"><a name="l17744"></a><span class="lineno">17744</span> <span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17745"></a><span class="lineno">17745</span>  </div>
-<div class="line"><a name="l17746"></a><span class="lineno">17746</span>  <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17747"></a><span class="lineno">17747</span>  {</div>
-<div class="line"><a name="l17748"></a><span class="lineno">17748</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, image, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17610"></a><span class="lineno">17610</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17611"></a><span class="lineno">17611</span>  </div>
+<div class="line"><a name="l17612"></a><span class="lineno">17612</span>  <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17613"></a><span class="lineno">17613</span>  {</div>
+<div class="line"><a name="l17614"></a><span class="lineno">17614</span>  (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, buffer, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17615"></a><span class="lineno">17615</span>  }</div>
+<div class="line"><a name="l17616"></a><span class="lineno">17616</span>  </div>
+<div class="line"><a name="l17617"></a><span class="lineno">17617</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17618"></a><span class="lineno">17618</span>  {</div>
+<div class="line"><a name="l17619"></a><span class="lineno">17619</span>  allocator->FreeMemory(</div>
+<div class="line"><a name="l17620"></a><span class="lineno">17620</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17621"></a><span class="lineno">17621</span>  &allocation);</div>
+<div class="line"><a name="l17622"></a><span class="lineno">17622</span>  }</div>
+<div class="line"><a name="l17623"></a><span class="lineno">17623</span> }</div>
+<div class="line"><a name="l17624"></a><span class="lineno">17624</span>  </div>
+<div class="line"><a name="l17625"></a><span class="lineno">17625</span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
+<div class="line"><a name="l17626"></a><span class="lineno">17626</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17627"></a><span class="lineno">17627</span>  <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l17628"></a><span class="lineno">17628</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l17629"></a><span class="lineno">17629</span>  VkImage* pImage,</div>
+<div class="line"><a name="l17630"></a><span class="lineno">17630</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l17631"></a><span class="lineno">17631</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17632"></a><span class="lineno">17632</span> {</div>
+<div class="line"><a name="l17633"></a><span class="lineno">17633</span>  VMA_ASSERT(allocator && pImageCreateInfo && pAllocationCreateInfo && pImage && pAllocation);</div>
+<div class="line"><a name="l17634"></a><span class="lineno">17634</span>  </div>
+<div class="line"><a name="l17635"></a><span class="lineno">17635</span>  <span class="keywordflow">if</span>(pImageCreateInfo->extent.width == 0 ||</div>
+<div class="line"><a name="l17636"></a><span class="lineno">17636</span>  pImageCreateInfo->extent.height == 0 ||</div>
+<div class="line"><a name="l17637"></a><span class="lineno">17637</span>  pImageCreateInfo->extent.depth == 0 ||</div>
+<div class="line"><a name="l17638"></a><span class="lineno">17638</span>  pImageCreateInfo->mipLevels == 0 ||</div>
+<div class="line"><a name="l17639"></a><span class="lineno">17639</span>  pImageCreateInfo->arrayLayers == 0)</div>
+<div class="line"><a name="l17640"></a><span class="lineno">17640</span>  {</div>
+<div class="line"><a name="l17641"></a><span class="lineno">17641</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l17642"></a><span class="lineno">17642</span>  }</div>
+<div class="line"><a name="l17643"></a><span class="lineno">17643</span>  </div>
+<div class="line"><a name="l17644"></a><span class="lineno">17644</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaCreateImage"</span>);</div>
+<div class="line"><a name="l17645"></a><span class="lineno">17645</span>  </div>
+<div class="line"><a name="l17646"></a><span class="lineno">17646</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17647"></a><span class="lineno">17647</span>  </div>
+<div class="line"><a name="l17648"></a><span class="lineno">17648</span>  *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17649"></a><span class="lineno">17649</span>  *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17650"></a><span class="lineno">17650</span>  </div>
+<div class="line"><a name="l17651"></a><span class="lineno">17651</span>  <span class="comment">// 1. Create VkImage.</span></div>
+<div class="line"><a name="l17652"></a><span class="lineno">17652</span>  VkResult res = (*allocator->GetVulkanFunctions().vkCreateImage)(</div>
+<div class="line"><a name="l17653"></a><span class="lineno">17653</span>  allocator->m_hDevice,</div>
+<div class="line"><a name="l17654"></a><span class="lineno">17654</span>  pImageCreateInfo,</div>
+<div class="line"><a name="l17655"></a><span class="lineno">17655</span>  allocator->GetAllocationCallbacks(),</div>
+<div class="line"><a name="l17656"></a><span class="lineno">17656</span>  pImage);</div>
+<div class="line"><a name="l17657"></a><span class="lineno">17657</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17658"></a><span class="lineno">17658</span>  {</div>
+<div class="line"><a name="l17659"></a><span class="lineno">17659</span>  VmaSuballocationType suballocType = pImageCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL ?</div>
+<div class="line"><a name="l17660"></a><span class="lineno">17660</span>  VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div>
+<div class="line"><a name="l17661"></a><span class="lineno">17661</span>  VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div>
+<div class="line"><a name="l17662"></a><span class="lineno">17662</span>  </div>
+<div class="line"><a name="l17663"></a><span class="lineno">17663</span>  <span class="comment">// 2. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l17664"></a><span class="lineno">17664</span>  VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l17665"></a><span class="lineno">17665</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17666"></a><span class="lineno">17666</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17667"></a><span class="lineno">17667</span>  allocator->GetImageMemoryRequirements(*pImage, vkMemReq,</div>
+<div class="line"><a name="l17668"></a><span class="lineno">17668</span>  requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l17669"></a><span class="lineno">17669</span>  </div>
+<div class="line"><a name="l17670"></a><span class="lineno">17670</span>  res = allocator->AllocateMemory(</div>
+<div class="line"><a name="l17671"></a><span class="lineno">17671</span>  vkMemReq,</div>
+<div class="line"><a name="l17672"></a><span class="lineno">17672</span>  requiresDedicatedAllocation,</div>
+<div class="line"><a name="l17673"></a><span class="lineno">17673</span>  prefersDedicatedAllocation,</div>
+<div class="line"><a name="l17674"></a><span class="lineno">17674</span>  VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l17675"></a><span class="lineno">17675</span>  *pImage, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l17676"></a><span class="lineno">17676</span>  *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17677"></a><span class="lineno">17677</span>  suballocType,</div>
+<div class="line"><a name="l17678"></a><span class="lineno">17678</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17679"></a><span class="lineno">17679</span>  pAllocation);</div>
+<div class="line"><a name="l17680"></a><span class="lineno">17680</span>  </div>
+<div class="line"><a name="l17681"></a><span class="lineno">17681</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17682"></a><span class="lineno">17682</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17683"></a><span class="lineno">17683</span>  {</div>
+<div class="line"><a name="l17684"></a><span class="lineno">17684</span>  allocator->GetRecorder()->RecordCreateImage(</div>
+<div class="line"><a name="l17685"></a><span class="lineno">17685</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17686"></a><span class="lineno">17686</span>  *pImageCreateInfo,</div>
+<div class="line"><a name="l17687"></a><span class="lineno">17687</span>  *pAllocationCreateInfo,</div>
+<div class="line"><a name="l17688"></a><span class="lineno">17688</span>  *pAllocation);</div>
+<div class="line"><a name="l17689"></a><span class="lineno">17689</span>  }</div>
+<div class="line"><a name="l17690"></a><span class="lineno">17690</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17691"></a><span class="lineno">17691</span>  </div>
+<div class="line"><a name="l17692"></a><span class="lineno">17692</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17693"></a><span class="lineno">17693</span>  {</div>
+<div class="line"><a name="l17694"></a><span class="lineno">17694</span>  <span class="comment">// 3. Bind image with memory.</span></div>
+<div class="line"><a name="l17695"></a><span class="lineno">17695</span>  <span class="keywordflow">if</span>((pAllocationCreateInfo-><a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> & <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l17696"></a><span class="lineno">17696</span>  {</div>
+<div class="line"><a name="l17697"></a><span class="lineno">17697</span>  res = allocator->BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div>
+<div class="line"><a name="l17698"></a><span class="lineno">17698</span>  }</div>
+<div class="line"><a name="l17699"></a><span class="lineno">17699</span>  <span class="keywordflow">if</span>(res >= 0)</div>
+<div class="line"><a name="l17700"></a><span class="lineno">17700</span>  {</div>
+<div class="line"><a name="l17701"></a><span class="lineno">17701</span>  <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l17702"></a><span class="lineno">17702</span> <span class="preprocessor"> #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17703"></a><span class="lineno">17703</span>  (*pAllocation)->InitBufferImageUsage(pImageCreateInfo->usage);</div>
+<div class="line"><a name="l17704"></a><span class="lineno">17704</span> <span class="preprocessor"> #endif</span></div>
+<div class="line"><a name="l17705"></a><span class="lineno">17705</span>  <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l17706"></a><span class="lineno">17706</span>  {</div>
+<div class="line"><a name="l17707"></a><span class="lineno">17707</span>  allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l17708"></a><span class="lineno">17708</span>  }</div>
+<div class="line"><a name="l17709"></a><span class="lineno">17709</span>  </div>
+<div class="line"><a name="l17710"></a><span class="lineno">17710</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17711"></a><span class="lineno">17711</span>  }</div>
+<div class="line"><a name="l17712"></a><span class="lineno">17712</span>  allocator->FreeMemory(</div>
+<div class="line"><a name="l17713"></a><span class="lineno">17713</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17714"></a><span class="lineno">17714</span>  pAllocation);</div>
+<div class="line"><a name="l17715"></a><span class="lineno">17715</span>  *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17716"></a><span class="lineno">17716</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17717"></a><span class="lineno">17717</span>  *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17718"></a><span class="lineno">17718</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17719"></a><span class="lineno">17719</span>  }</div>
+<div class="line"><a name="l17720"></a><span class="lineno">17720</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, *pImage, allocator->GetAllocationCallbacks());</div>
+<div class="line"><a name="l17721"></a><span class="lineno">17721</span>  *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17722"></a><span class="lineno">17722</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17723"></a><span class="lineno">17723</span>  }</div>
+<div class="line"><a name="l17724"></a><span class="lineno">17724</span>  <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17725"></a><span class="lineno">17725</span> }</div>
+<div class="line"><a name="l17726"></a><span class="lineno">17726</span>  </div>
+<div class="line"><a name="l17727"></a><span class="lineno">17727</span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
+<div class="line"><a name="l17728"></a><span class="lineno">17728</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l17729"></a><span class="lineno">17729</span>  VkImage image,</div>
+<div class="line"><a name="l17730"></a><span class="lineno">17730</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17731"></a><span class="lineno">17731</span> {</div>
+<div class="line"><a name="l17732"></a><span class="lineno">17732</span>  VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l17733"></a><span class="lineno">17733</span>  </div>
+<div class="line"><a name="l17734"></a><span class="lineno">17734</span>  <span class="keywordflow">if</span>(image == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17735"></a><span class="lineno">17735</span>  {</div>
+<div class="line"><a name="l17736"></a><span class="lineno">17736</span>  <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17737"></a><span class="lineno">17737</span>  }</div>
+<div class="line"><a name="l17738"></a><span class="lineno">17738</span>  </div>
+<div class="line"><a name="l17739"></a><span class="lineno">17739</span>  VMA_DEBUG_LOG(<span class="stringliteral">"vmaDestroyImage"</span>);</div>
+<div class="line"><a name="l17740"></a><span class="lineno">17740</span>  </div>
+<div class="line"><a name="l17741"></a><span class="lineno">17741</span>  VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17742"></a><span class="lineno">17742</span>  </div>
+<div class="line"><a name="l17743"></a><span class="lineno">17743</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l17744"></a><span class="lineno">17744</span>  <span class="keywordflow">if</span>(allocator->GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l17745"></a><span class="lineno">17745</span>  {</div>
+<div class="line"><a name="l17746"></a><span class="lineno">17746</span>  allocator->GetRecorder()->RecordDestroyImage(</div>
+<div class="line"><a name="l17747"></a><span class="lineno">17747</span>  allocator->GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l17748"></a><span class="lineno">17748</span>  allocation);</div>
<div class="line"><a name="l17749"></a><span class="lineno">17749</span>  }</div>
-<div class="line"><a name="l17750"></a><span class="lineno">17750</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17751"></a><span class="lineno">17751</span>  {</div>
-<div class="line"><a name="l17752"></a><span class="lineno">17752</span>  allocator->FreeMemory(</div>
-<div class="line"><a name="l17753"></a><span class="lineno">17753</span>  1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l17754"></a><span class="lineno">17754</span>  &allocation);</div>
+<div class="line"><a name="l17750"></a><span class="lineno">17750</span> <span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17751"></a><span class="lineno">17751</span>  </div>
+<div class="line"><a name="l17752"></a><span class="lineno">17752</span>  <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17753"></a><span class="lineno">17753</span>  {</div>
+<div class="line"><a name="l17754"></a><span class="lineno">17754</span>  (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, image, allocator->GetAllocationCallbacks());</div>
<div class="line"><a name="l17755"></a><span class="lineno">17755</span>  }</div>
-<div class="line"><a name="l17756"></a><span class="lineno">17756</span> }</div>
-<div class="line"><a name="l17757"></a><span class="lineno">17757</span>  </div>
-<div class="line"><a name="l17758"></a><span class="lineno">17758</span> <span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l17756"></a><span class="lineno">17756</span>  <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l17757"></a><span class="lineno">17757</span>  {</div>
+<div class="line"><a name="l17758"></a><span class="lineno">17758</span>  allocator->FreeMemory(</div>
+<div class="line"><a name="l17759"></a><span class="lineno">17759</span>  1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l17760"></a><span class="lineno">17760</span>  &allocation);</div>
+<div class="line"><a name="l17761"></a><span class="lineno">17761</span>  }</div>
+<div class="line"><a name="l17762"></a><span class="lineno">17762</span> }</div>
+<div class="line"><a name="l17763"></a><span class="lineno">17763</span>  </div>
+<div class="line"><a name="l17764"></a><span class="lineno">17764</span> <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:1979</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:1937</div></div>
diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index ee3f8c8..e9872d5 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -32,8 +32,8 @@
static const char* const SHADER_PATH2 = "../bin/";
static const wchar_t* const WINDOW_CLASS_NAME = L"VULKAN_MEMORY_ALLOCATOR_SAMPLE";
static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation";
-static const char* const APP_TITLE_A = "Vulkan Memory Allocator Sample 2.3.0-alpha.1";
-static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.3.0-alpha.1";
+static const char* const APP_TITLE_A = "Vulkan Memory Allocator Sample 2.3.0";
+static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.3.0";
static const bool VSYNC = true;
static const uint32_t COMMAND_BUFFER_COUNT = 2;
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 0a1bd23..32258b4 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -29,7 +29,7 @@
/** \mainpage Vulkan Memory Allocator
-<b>Version 2.3.0-alpha.1</b> (2019-11-25)
+<b>Version 2.3.0</b> (2019-12-04)
Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. \n
License: MIT